为什么内存中的 javascript 对象文字比 JSON 形式的文本文件大小大得多?

pet*_*ete 2 javascript json node.js

我有一个巨大的 JSON(我们称之为 {...}),大约 80 MB。所有键/值都是字符串或对象。我希望如果我通过说 var myJson = {...} 将它加载到 javascript 中,它占用的内存量不应超过 80 MB。然而,使用 node.js 的 process.memoryUsage(),我看到一旦我加载这个对象,我使用的内存就会增加大约 600 MB。为什么会发生这种情况,有哪些解决方法?

编辑:我已将其从 var myJSon = {...} 更改为 const myJson = require('./database.json'),将 json 的内容放在 .json 文件而不是 .js 文件中。奇怪的是,这似乎将使用的内存量减少了 50%,所以仍然是 .json 文件的 4 倍左右。

sha*_*ncs 5

JSON 文本文件大小和 JSON 对象内存大小之间存在差距。

“它占用的内存量不应超过 80 MB”——这不是真的,尤其是当对象非常大时。

根据ECMAScript 语言规范,每个字符串字符将占用 16 位,每个数值将占用 64 位。这意味着 JSON 文本文件大小和 JSON 对象内存大小之间存在巨大差距。

以下面的简单对象为例:{name:'John',age:16}. 将此对象保存为文本文件只需要 20 个 ascii 字符,即20 Bytes。但是,在内存中存储这个 JSON 对象至少需要30 个字节("name".length + "John".length + "age".length = 11,每个字符占用 2 Bytes,即 22 Bytes;加上 8 Bytes用于16,总共需要 30 个字节。)。

内部对象结构(“John”映射到“name”,16映射到“age”)也占用内存。即使没有这个考虑,对于这样一个简单的对象来说,20 Bytes 和 30 Bytes 之间的差距已经很大了。

如果 JSON 对象很大(如所讨论的对象),或者 JSON 对象结构非常复杂,则差距将非常大。

当然,JavaScript 引擎会做一些优化工作,减少内存的使用。但是由于 ECMAScript 规范已经说明了字符串和数字等的位使用,因此这种差距是永远存在的,而且这种差距并非微不足道。

ps 有一个名为object-sizeof的 npm 模块,可以用来估计对象内存分配。