я встраиваю большой массив в теги
в свой HTML, вот так (ничего удивительного):
В этом конкретном примере в массиве 210 000 элементов. Это значительно ниже теоретического максимума 2 31 - на 4 порядка . Вот что интересно: если я сохраню исходный код JS для массива в файл, размер этого файла будет> 44 мегабайт (46 573 399 байт, если быть точным).
Если вы хотите убедиться в этом сами, вы можете скачать его из GitHub . (Все данные там сохранены, поэтому многие из них повторяются. В производственной среде этого не будет.)
Теперь меня действительно не беспокоит , обслуживающий так много данных. Мой сервер сжимает свои ответы, поэтому на самом деле это не так. У меня уходит много времени на передачу данных по сети. Однако существует действительно неприятная тенденция для страницы после загрузки сбой браузера. Я вообще не тестирую в IE (это внутренний инструмент). Мои основные цели - Chrome 8 и Firefox 3.6.
В Firefox я вижу довольно полезную ошибку в консоли:
Ошибка: квота пространства стека сценария исчерпана
В Chrome я просто получаю печальное - страница вкладки:
Между прочим, мне удалось заставить это работать (читай: не приводить к сбою вкладки) время от времени в Chrome. Я действительно думал, что Chrome, по крайней мере, сделан из более жесткого материала, но, видимо, я ошибался ...
@Crayon: Я не пытался оправдать , почему я хотел бы сразу выгрузить столько данных в браузер. Краткая версия: либо я решаю эту (правда, не такую простую) проблему, либо мне нужно решить целый ряд других проблем. Сейчас я предпочитаю более простой подход.
@various: прямо сейчас я не особо ищу способы реально уменьшить количество элементов в массиве. Я знаю, что могу реализовать подкачку Ajax или что-то еще, но это создает для меня свой собственный набор проблем в других отношениях.
@Phrogz: каждый элемент выглядит примерно так:
{dateTime:new Date(1296176400000),
terminalId:'terminal999',
'General___BuildVersion':'10.05a_V110119_Beta',
'SSM___ExtId':26680,
'MD_CDMA_NETLOADER_NO_BCAST___Valid':'false',
'MD_CDMA_NETLOADER_NO_BCAST___PngAttempt':0}
@Will: но у меня есть компьютер с 4-ядерным процессором, 6 гигабайт оперативной памяти, более половины терабайта дискового пространства ... и я даже не прошу браузер делать это быстро - я просто прошу, чтобы он работал вообще! ☹
Миссия выполнена!
С точными предложениями от Хуана , а также Гуффа я смог передать это Работа! Казалось бы, проблема заключалась только в синтаксическом разборе исходного кода, а не в работе с ним в памяти.
Подводя итог трясине комментариев к ответу Хуана: мне пришлось разбить свой большой массив на серию меньших, а затем Array # concat ()
их, но этого было недостаточно. Мне также пришлось поместить их в отдельные операторы var
. Как это:
var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);
Всем, кто внес свой вклад в решение этой проблемы: спасибо. Первый раунд на мне!
* кроме очевидного: отправка меньшего количества данных в браузер