Есть ли ограничения на количество свойств в объекте JavaScript? - PullRequest
15 голосов
/ 14 февраля 2012

У нас есть объект с более чем 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 работает нормально.

Ответы [ 5 ]

7 голосов
/ 29 января 2016

Я не уверен, каково значение фактического , но я вижу верхний предел практического около 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 (число в МБ).

5 голосов
/ 15 февраля 2012

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

5 голосов
/ 14 февраля 2012

Точный максимальный предел массива составляет 2 ^ 32 - 1 или 4294967295 из-за ограничений в памяти Javascript.

Ссылка

4 голосов
/ 14 февраля 2012

Это будет 2 ^ 32 - 1;однако определенные браузеры могут ограничить его еще больше.

3 голосов
/ 05 сентября 2017

В текущей версии 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 миллиона ключей до того, как она выйдет из строя (вы можете преодолеть этот лимит с помощью чего-то вроде this ).

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