Достиг ли я пределов размера объектов, которые JavaScript может обрабатывать в моем браузере?

я встраиваю большой массив в теги в свой HTML, вот так (ничего удивительного):


В этом конкретном примере в массиве 210 000 элементов. Это значительно ниже теоретического максимума 2 31 - на 4 порядка . Вот что интересно: если я сохраню исходный код JS для массива в файл, размер этого файла будет> 44 мегабайт (46 573 399 байт, если быть точным).

Если вы хотите убедиться в этом сами, вы можете скачать его из GitHub . (Все данные там сохранены, поэтому многие из них повторяются. В производственной среде этого не будет.)

Теперь меня действительно не беспокоит , обслуживающий так много данных. Мой сервер сжимает свои ответы, поэтому на самом деле это не так. У меня уходит много времени на передачу данных по сети. Однако существует действительно неприятная тенденция для страницы после загрузки сбой браузера. Я вообще не тестирую в IE (это внутренний инструмент). Мои основные цели - Chrome 8 и Firefox 3.6.

В Firefox я вижу довольно полезную ошибку в консоли:

Ошибка: квота пространства стека сценария исчерпана

В Chrome я просто получаю печальное - страница вкладки:

enter image description here

Переходим к делу, уже

  • Неужели это действительно слишком много данных для обработки нашими современными "высокопроизводительными" браузерами?
  • Могу я что-нибудь сделать * чтобы изящно обрабатывать такой объем данных?

Между прочим, мне удалось заставить это работать (читай: не приводить к сбою вкладки) время от времени в Chrome. Я действительно думал, что Chrome, по крайней мере, сделан из более жесткого материала, но, видимо, я ошибался ...


Редактировать 1

@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 гигабайт оперативной памяти, более половины терабайта дискового пространства ... и я даже не прошу браузер делать это быстро - я просто прошу, чтобы он работал вообще!


Редактировать 2

Миссия выполнена!

С точными предложениями от Хуана , а также Гуффа я смог передать это Работа! Казалось бы, проблема заключалась только в синтаксическом разборе исходного кода, а не в работе с ним в памяти.

Подводя итог трясине комментариев к ответу Хуана: мне пришлось разбить свой большой массив на серию меньших, а затем Array # concat () их, но этого было недостаточно. Мне также пришлось поместить их в отдельные операторы var . Как это:

var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);

Всем, кто внес свой вклад в решение этой проблемы: спасибо. Первый раунд на мне!


* кроме очевидного: отправка меньшего количества данных в браузер

63
задан Community 23 May 2017 в 12:02
поделиться