Javascript / Node.js引擎如何在内存中存储JSON?
我有一个70 MB的JSON文件,我从一个Node.js脚本读取并分配给一个variables。
console.log(process.memoryUsage()); let data=require('../newJSON.json'); console.log(process.memoryUsage());
输出:
{ rss: 28184576, heapTotal: 6283264, heapUsed: 4199672, external: 8252 } { rss: 724721664, heapTotal: 695595008, heapUsed: 663708016, external: 8252 }
看来,70 MB的JSON需要632 MB的内存。 我有兴趣了解JSON如何通过Node Js / Javascript存储到内存中?
首先,JSON只是对象的string表示。 没有什么特别的“JSON对象”–JSONparsing器parsingJSONstring并从中创build常规的JavaScript对象。 这个:
var a = JSON.parse('{"foo": "bar"}');
和这个:
var a = new Object(); a.foo = "bar";
是完全等同的。
内存中的对象存储是复杂的,因为现代的JavaScript引擎对各种不同的情况都有非常漂亮的优化,取决于你的代码在做什么。
JSONstring的长度和内存中相应对象的大小并不严格相关; 在大多数情况下,JSON表示预计会变小,有时会变得很多。 例如,对于你的例子的最内层嵌套: "a":0,
需要6个字节,而对于创build的对象中的一个更多的属性,你需要:
- 一个指针为财产的名字,“一个”
- 一个属性属性的指针(可写,可枚举,可configuration)
- 一个属性值为0的指针
- 假设对象处于字典模式:平均而言,约有两个松弛指针
在一个64位平台上,总共可以达到40个字节。
如果您查看类似形状的整个对象: {"a":0,"b":1}
是13个字符,而内存要求是:
- “地图”指针
- “元素”指针(未使用)
- 超出对象的“属性”指针(未使用)
- 第一个属性的值(0)
- 第二财产的价值(1)
- 该对象的“映射”:11个指针(可以与其他具有相同形状的对象共享,但是如果只有一个这样的对象,则没有任何东西可以共享)
- 该对象的映射的属性描述符:10个指针
总共有26个指针或208个字节。
最后,您可能会发现某些内存使用情况是由GC随着时间的推移而清理的临时对象造成的。