JavaScript对象中的属性数量是否有限制?

时间:2022-08-30 10:14:45

We have an object with more than 75000 properties. The format of the object is as following:

我们有一个超过75000个属性的对象。对象的格式如下:

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

Is there a known limit of the quantity of properties for JavaScript objects? From my tests the object still works at 65500 elements.

是否已知JavaScript对象的属性数量限制?从我的测试中,该对象仍然适用于65500个元素。

  • In Windows 7, IE9 the script crashes (error -2147024882).
  • 在Windows 7中,IE9脚本崩溃(错误-2147024882)。
  • Windows XP, IE8 works fine.
  • Windows XP,IE8工作正常。

5 个解决方案

#1


5  

From our test on this issue it seems that IE9, Windows 7, limits the number of line in a HTA script to 65535. I did not find any source on the issue, it is just the results of our tests.

从我们对这个问题的测试看来,IE9,Windows 7,将HTA脚本中的行数限制为65535.我没有找到任何关于此问题的来源,这只是我们测试的结果。

#2


5  

I'm not sure what the actual value is, but I see the practical upper limit around 400,000 in node.js (on a Mac with 16 GB of RAM).

我不确定实际值是多少,但我在node.js中看到了大约400,000的实际上限(在具有16 GB RAM的Mac上)。

Here is a log of me adding rows from a database into an object:

这是我将数据库中的行添加到对象中的日志:

[[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

Until around 400,000 it takes about 1 second to insert 10,000 new records. Past 410,000, the time increases almost exponentially.

直到大约400,000,大约需要1秒才能插入10,000条新记录。过去410,000,时间几乎呈指数增长。

I'm not sure how I'll solve this. Maybe make 2 objects and limit them to 400,000 keys each... a bit labor-intensive but better than rewriting a dictionary object :)

我不确定我将如何解决这个问题。也许制作2个对象并将它们限制为每个400,000个密钥...有点劳动密集但比重写字典对象更好:)

Update: It looks like it's actually the amount of memory used that is the issue and not so much the number of objects. My machine slows to a crawl at about 1.5 GB of RAM used. It might be linked to the memory allocated to the node.js process, which can be increased with this parameter: --max_old_space_size=4096 (number is in MB).

更新:看起来它实际上是使用的内存量是问题,而不是对象的数量。我的机器在使用大约1.5 GB的RAM时慢慢爬行。它可能链接到分配给node.js进程的内存,可以使用此参数增加: - max_old_space_size = 4096(数字以MB为单位)。

#3


4  

The exact maximum limit of an array is 2^32 - 1 or 4294967295, due to restrictions in Javascript's memory.

由于Javascript内存的限制,数组的确切最大限制为2 ^ 32 - 1或4294967295。

Link

链接

#4


4  

It's going to be 2^32 - 1; however, specific browsers may limit it further.

它将是2 ^ 32 - 1;但是,特定浏览器可能会进一步限制它。

#5


1  

In the current version of Chrome (Sept 2017), I'm limited to around 8.3 million keys. Try pasting this in your browser console:

在当前版本的Chrome(2017年9月)中,我的密钥限制在830万左右。尝试在浏览器控制台中粘贴它:

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

I get an identical limit in Node.js:

我在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); }"

Interestingly, if I use a Map, I can get about 16.8 million keys before it crashes (you can get past this limit with something like this).

有趣的是,如果我使用Map,我可以在崩溃之前获得大约1680万个密钥(你可以通过这样的方式超过这个限制)。

#1


5  

From our test on this issue it seems that IE9, Windows 7, limits the number of line in a HTA script to 65535. I did not find any source on the issue, it is just the results of our tests.

从我们对这个问题的测试看来,IE9,Windows 7,将HTA脚本中的行数限制为65535.我没有找到任何关于此问题的来源,这只是我们测试的结果。

#2


5  

I'm not sure what the actual value is, but I see the practical upper limit around 400,000 in node.js (on a Mac with 16 GB of RAM).

我不确定实际值是多少,但我在node.js中看到了大约400,000的实际上限(在具有16 GB RAM的Mac上)。

Here is a log of me adding rows from a database into an object:

这是我将数据库中的行添加到对象中的日志:

[[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

Until around 400,000 it takes about 1 second to insert 10,000 new records. Past 410,000, the time increases almost exponentially.

直到大约400,000,大约需要1秒才能插入10,000条新记录。过去410,000,时间几乎呈指数增长。

I'm not sure how I'll solve this. Maybe make 2 objects and limit them to 400,000 keys each... a bit labor-intensive but better than rewriting a dictionary object :)

我不确定我将如何解决这个问题。也许制作2个对象并将它们限制为每个400,000个密钥...有点劳动密集但比重写字典对象更好:)

Update: It looks like it's actually the amount of memory used that is the issue and not so much the number of objects. My machine slows to a crawl at about 1.5 GB of RAM used. It might be linked to the memory allocated to the node.js process, which can be increased with this parameter: --max_old_space_size=4096 (number is in MB).

更新:看起来它实际上是使用的内存量是问题,而不是对象的数量。我的机器在使用大约1.5 GB的RAM时慢慢爬行。它可能链接到分配给node.js进程的内存,可以使用此参数增加: - max_old_space_size = 4096(数字以MB为单位)。

#3


4  

The exact maximum limit of an array is 2^32 - 1 or 4294967295, due to restrictions in Javascript's memory.

由于Javascript内存的限制,数组的确切最大限制为2 ^ 32 - 1或4294967295。

Link

链接

#4


4  

It's going to be 2^32 - 1; however, specific browsers may limit it further.

它将是2 ^ 32 - 1;但是,特定浏览器可能会进一步限制它。

#5


1  

In the current version of Chrome (Sept 2017), I'm limited to around 8.3 million keys. Try pasting this in your browser console:

在当前版本的Chrome(2017年9月)中,我的密钥限制在830万左右。尝试在浏览器控制台中粘贴它:

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

I get an identical limit in Node.js:

我在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); }"

Interestingly, if I use a Map, I can get about 16.8 million keys before it crashes (you can get past this limit with something like this).

有趣的是,如果我使用Map,我可以在崩溃之前获得大约1680万个密钥(你可以通过这样的方式超过这个限制)。