Максимальный размер массива в 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 Мо данных вверх с довольно интенсивными вычислениями в наборе данных. Я сомневаюсь, что у вас возникнут проблемы с памятью, если у вас нет интенсивных вычислений по данным и многим многим строкам. Профилирование и бенчмаркинг с помощью разных фиктивных результатов - ваш лучший выбор для оценки производительности.