Существуют ли ограничения на количество свойств в объекте 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 работает нормально.

5 ответов


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

ссылке


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


Я не уверен, что фактический значение есть, но я вижу практические верхний предел около 400,000 в узел.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 секунды, чтобы вставить 10 000 новых записей. После 410 000 время увеличивается почти экспоненциально.

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

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


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


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

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

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