Максимальный размер массива в Javascript

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

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

Веб-сайт будет запущен и обновлен, и маловероятно, что браузер будет перезагружен/обновлен, что часто.

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

Ответ 1

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

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

Ответ 2

Нет необходимости обрезать массив, просто обращайтесь к нему как к циклическому буферу (index% 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");
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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