Я встраиваю большой массив в теги <script>
в свой HTML, как это (ничего удивительного):
<script>
var largeArray = [/* lots of stuff in here */];
</script>
В этом конкретном примере массив содержит 210 000 элементов. Это значительно ниже теоретического максимума 2 31 - на 4 порядка. Здесь интересная часть: если я сохраню источник JS для массива в файл, этот файл составляет > 44 мегабайта (точнее, 46 573 399 байт).
Если вы хотите убедиться сами, вы можете загрузить его из GitHub. (Все данные в нем консервированы, поэтому многое из этого повторяется. Это не будет иметь место в производстве.)
Теперь я действительно не забочусь о том, чтобы обслуживать столько данных. Мой сервер gzip его ответы, поэтому на самом деле не так много времени, чтобы получить данные по проводу. Тем не менее, существует очень неприятная тенденция для страницы, после загрузки, в сбой браузера. Я вообще не тестирую IE (это внутренний инструмент). Моими основными целями являются Chrome 8 и Firefox 3.6.
В Firefox я вижу достаточно полезную ошибку в консоли:
Error: script stack space quota is exhausted
В Chrome я просто получаю страницу sad-tab:
Вырезать на погоню, уже
- Это слишком большие данные для современных современных высокопроизводительных браузеров?
- Есть ли что-нибудь, что я могу сделать *, чтобы изящно обрабатывать эти данные?
Кстати, я смог заставить это работать (читать: не сбрасывать вкладку) в 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
Миссия выполнена!
С подсказками от Juan, а также Guffa, я смог получить это работать! Казалось бы, проблема заключалась в разборе исходного кода, а не в работе с ним в памяти.
Подводя итог комментарию комментария к ответу Хуана: мне пришлось разделить мой большой массив на несколько меньших, а затем Array#concat()
их, но этого было недостаточно. Я также должен был помещать их в отдельные инструкции var
. Вот так:
var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);
Для всех, кто помог решить это: спасибо. Первый раунд на мне!
*, кроме очевидного: отправка меньше данных в браузер