Как передать большой (30мб) json в браузер за раз, чтобы браузер не упал?
Требуется через ajax выгрузить на страницу около 100000 записей общим размером чуть больше 30 мегабайт. Загружать нужно через ОДИН ajax запрос, и уже на странице оперировать всеми этими данными. Проблема в том, что, google chrome, например, при передаче через ajax больше 20 МБ крашится.
Формат одной записи: 10 полей, в каждое либо целое число, либо timestamp, либо небольшой текст (до 50 символов). Менять формат записи не входит в задачу и не представляется возможным.
1) Оптимизировать структуру данных JSON для транспортировки
2) Использовать бинарный формат вместо JSON
3) gzip тоже помогает
4) Грузить в веб-воркере и передавать в основное приложение по загрузке (судя по объему вычисления лучше делать там же)
mxSandr: Там описание, но не пример. У меня была задача загрузить и отрендерить 30к точек на карте, да ещё и хранить в localStorage, не упираясь в лимиты. Так вот изменение формата данных как раз очень даже входит в задачу и предоставляется очень даже возможным, при условии что вы контролируете сервер и на самом деле хотите, чтобы оно заработало)
Итак, результаты.
1)Структура дается неизменной.
2)То же, что и пункт 1
3)Единственный выход. Помогло сжатие в PHP, разжатие в JS. Никак не удалось по-другому скормить хрому больше 22 с копейками мегабайт. Во всяком случае, я не нашел.
4)Интересная технология. Но все равно хром падает (v 42.0.2311.135)
вам нужно на стороне сервера все манипуляции делать, а клиент только выводит данные. если присутствуют какие то фильтры, то передавать на основе них запросы к серверу, чтобы тот корректно вернул новые данные
Стоит задача: около ста тысяч записей, с ними уже проманипулированно все что можно на стороне сервера. Задача просто просматривать их на клиенте. Но передать все записи нужно через 1 (один) axaj запрос. "Постраничный" вывод всей кучи по нажатию на кнопочки - дело техники, как бы так хитро передать, чтобы браузеры не падали.
mxSandr: "забавно" как раз в том, что вам человек уже впрямую сказал, что задача поставлена неверное, любой, абсолютно любой запрос можно разбить на несколько. по этому дальнейшее рассуждение не имеет смысла. И вообще 30 мб текста это оооочень много, даже если не сжимать.
Разбить можно. Можно что угодно в пределах известных законов физики. Речь не о том, можно или нет, речь идет о выполнении конкретно поставленной задачи.
Как раз таки - задача подгрузить из одного ajax запроса данные размером более 30мб. Зачем флуд наводить? Мы разве обсуждаем здесь постановку задачи? Я же конкретно обозначил условия.
Попробуйте загрузить из вебворкера, без обработки, просто xhr и дождаться окончания приема. Надо понять, где именно он крашится, внутри самого xhr или уже потом. Если второе, то можно поиграть событием получения порции, принудительно разбивая данные на куски.
Также в порядке бреда можно попробовать jsonp или грузить через iframe
Задача решилась сжатием самой информации, но по сути это не решение. Вариант со сжатием пойдет в работу, но твой способ с разбиением данные на порции в воркере я опробую на выходных и обязательно отпишу результат. Спасибо!