Максимальный размер массива в Javascript - PullRequest
96 голосов
/ 27 мая 2011

Контекст: я создаю небольшой сайт, который читает RSS-канал и обновляет / проверяет канал в фоновом режиме. У меня есть один массив для хранения данных для отображения, а другой хранит идентификаторы записей, которые были показаны.

Вопрос: Сколько элементов может содержать массив в Javascript до того, как дела начнут замедляться или замедляться. Я не сортирую массив, но использую функцию inArray в jQuery для сравнения.

Сайт будет работать и обновляться, и маловероятно, что браузер будет перезапускаться / обновляться так часто.

Если мне стоит подумать об очистке некоторых записей из массива, каков наилучший способ удалить некоторые записи после ограничения, например, 100 элементов.

Ответы [ 6 ]

133 голосов
/ 27 мая 2011

Максимальная длина до тех пор, пока «он не станет медленным», полностью зависит от вашей целевой машины и вашего фактического кода, поэтому вам нужно будет протестировать на этой (этих) платформах, чтобы увидеть, что приемлемо.

Однако максимальная длина массива в соответствии со спецификацией ECMA-262 5-го издания ограничена 32-разрядным целым числом без знака из-за абстрактной операции ToUint32 , поэтому самый длинный из возможных массивов может иметь 2 32 -1 = 4 294 967 295 = 4,29 млрд. Элементов.

26 голосов
/ 13 июля 2012

Нет необходимости обрезать массив, просто адресуйте его как кольцевой буфер (индекс% maxlen). Это гарантирует, что он никогда не превысит ограничение (реализация циклического буфера означает, что, как только вы дойдете до конца, вы снова переместитесь в начало - невозможно заполнить конец массива).

Например:

var container = new Array ();
var maxlen = 100;
var index = 0;

// 'store' 1538 items (only the last 'maxlen' items are kept)
for (var i=0; i<1538; i++) {
   container [index++ % maxlen] = "storing" + i;
}

// get element at index 11 (you want the 11th item in the array)
eleventh = container [(index + 11) % maxlen];

// get element at index 11 (you want the 11th item in the array)
thirtyfifth = container [(index + 35) % maxlen];

// print out all 100 elements that we have left in the array, note
// that it doesn't matter if we address past 100 - circular buffer
// so we'll simply get back to the beginning if we do that.
for (i=0; i<200; i++) {
   document.write (container[(index + i) % maxlen] + "<br>\n");
}
5 голосов
/ 27 мая 2011

Вы можете попробовать что-то вроде этого, чтобы проверить и обрезать длину:

http://jsfiddle.net/orolo/wJDXL/

var longArray = [1, 2, 3, 4, 5, 6, 7, 8];

if (longArray.length >= 6) {
    longArray.length = 3; 
}

    alert(longArray); //1, 2, 3
2 голосов
/ 27 мая 2011

Я создал платформу производительности, которая манипулирует и отображает миллионы наборов данных, и даже тогда задержка вычисления javascript составляла порядка десятков миллисекунд.Если вы не беспокоитесь о превышении предельного размера массива, я не думаю, что вам есть о чем беспокоиться.

0 голосов
/ 27 мая 2011

Я бесстыдно вытащил некоторые довольно большие наборы данных в память, и, хотя это стало вялым, потребовалось около 15 млн. Данных вверх с довольно интенсивными вычислениями для набора данных. Я сомневаюсь, что вы столкнетесь с проблемами с памятью, если у вас нет интенсивных расчетов на данных и много много строк. Профилирование и сравнительный анализ с различными фиктивными наборами результатов будут лучшим выбором для оценки производительности.

0 голосов
/ 27 мая 2011

Это будет зависеть от браузера. 100 предметов не звучат как большое количество - я думаю, вы могли бы пойти намного выше, чем это. Тысячи не должны быть проблемой. Что может быть проблемой, это общее потребление памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...