Есть ли ограничения на количество свойств в объекте JavaScript?

У нас есть объект с более чем 75000 свойств. Формат объекта следующий:

// The key starts with 3 letters and then is followed by 8 numbers
var bigArray = {'AAA########':123456789,
                'AAA########':123456790,
                'AAA########':123456791
               }; 

Существует ли известный предел количества свойств для объектов JavaScript? Из моих тестов объект все еще работает на 65500 элементов.

В Windows 7, IE9 скрипт вылетает (ошибка -2147024882).Windows XP, IE8 работает отлично.
 talnicolas14 февр. 2012 г., 20:21
У тебя какие-то проблемы?
 Tobias Beuving23 февр. 2015 г., 17:15
65535 (максимальное значение double byte int) кажется безопасным предположениемen.wikipedia.org/wiki/65535_(number)
 Diodeus - James MacFarlane14 февр. 2012 г., 20:23
Не хватает памяти?

Ответы на вопрос(5)

Решение Вопроса

что IE9, Windows 7, ограничивает количество строк в скрипте HTA до 65535. Я не нашел никакого источника по этой проблеме, это всего лишь результаты наших тестов.

5 из-за ограничений в памяти Javascript.

Ссылка

 talnicolas14 февр. 2012 г., 20:27
Ну, я думаю, что любой тип будет ограничен памятью Javascript, нет?
 Justin Niessner14 февр. 2012 г., 20:25
ОП не использует массив, он просто объявляет один большой объект.

однако, определенные браузеры могут ограничить это далее.

фактический значение есть, но я вижупрактическое верхний предел около 400 000 в node.js (на Mac с 16 ГБ ОЗУ).

Вот журнал моего добавления строк из базы данных в объект:

[[21:32:34.325]] [LOG] 340001, pint of delight
[[21:32:35.574]] [LOG] 350001, pound shrimp
[[21:32:36.545]] [LOG] 360001, ravioli allaragosta
[[21:32:37.721]] [LOG] 370001, roasted ham and cheese
[[21:32:39.862]] [LOG] 380001, salmon kama
[[21:32:41.152]] [LOG] 390001, scallops and vegetables
[[21:32:42.150]] [LOG] 400001, show cabernet ca
[[21:32:44.412]] [LOG] 410001, sloppy nachos
[[21:33:25.425]] [LOG] 420001, spaghetti or ziti sauce
[[21:35:37.839]] [LOG] 430001, steak au poivre vert
[[21:37:37.202]] [LOG] 440001, sushi moriawase
[[21:39:45.365]] [LOG] 450001, tequila shooters
[[21:42:09.036]] [LOG] 460001, toro roll with scallion
[[21:44:32.796]] [LOG] 470001, two enchiladas taco rice and refried beans
[[21:47:02.584]] [LOG] 480001, veuve clicquot ponsardin rose reims nv
[[21:49:04.020]] [LOG] 490001, whole turkey gourmet sides
[[21:51:15.264]] [LOG] finished

Приблизительно до 400 000 требуется около 1 секунды, чтобы вставить 10000 новых записей. В прошлом 410 000, время увеличивается почти в геометрической прогрессии.

Я не уверен, как я это решу. Может быть, сделать 2 объекта и ограничить их до 400 000 ключей каждый ... немного трудоемким, но лучше, чем переписать объект словаря :)

Обновить: Похоже, это на самом делеобъем памяти используется именно проблема, а не столько количество объектов. Моя машина замедляется до 1,5 ГБ используемой оперативной памяти. Он может быть связан с памятью, выделенной для процесса node.js, который может быть увеличен с помощью этого параметра: --max_old_space_size = 4096 (число в МБ).

 Nico15 нояб. 2016 г., 04:53
Не уверен, но у меня есть 16 ГБ ОЗУ - вы можете настроить параметр --max_old_space_size; какое странное имя в любом случае ...!
 Kyle Hotchkiss28 окт. 2016 г., 19:18
Знаете ли вы, 4 ГБ для всех установок NodeJS или просто зависит от вашего собственного компьютера?

В текущей версии Chrome (сентябрь 2017 г.) я ограничен примерно8,3 миллиона ключей, Попробуйте вставить это в консоль браузера:

let obj = {};
let keyCount = 0;
while(1) {
  obj[Math.random()] = Math.random();
  if(++keyCount % 10000 === 0) console.log(keyCount);
}

Я получаю идентичный лимит в Node.js:

node --max-old-space-size=20000 -e "let obj = {}; let keyCount = 0; while(1) { obj[Math.random()] = Math.random(); if(++keyCount % 10000 === 0) console.log(keyCount); }"

Интересно, если я используюкартаЯ могу получить о16,8 миллиона ключи до его сбоя (вы можете преодолеть этот предел с помощью чего-то вродеэто).

Ваш ответ на вопрос