Node.js中JSONstring的大小是否有限制?

我的Node.js应用程序的一部分涉及从用户接收string作为input并将其存储在JSON文件中。 JSON本身显然没有限制,但是Node上可以处理成JSON的文本数量有没有上限?

请注意,我没有使用MongoDB或任何其他技术进行实际插入 – 这是本地string化并使用fs保存到.json文件。

V8(JavaScript引擎节点是build立在)直到最近才有了1.9 GB的堆大小的硬性限制 。

由于破坏了原生插件周围的V8 API更改,v0.10节点停留在旧版本的V8(3.14)上。 节点0.12将更新到最新的V8(3.26),这将打破许多本地模块,但打开了1.9 GB堆的限制提出的大门。

因此,单个节点进程可以保留不超过1.9 GB的JavaScript代码,对象,string等。 这意味着一个string的最大长度是在1.9 GB以下。

可以通过使用Buffer来解决这个问题,它将数据存储在V8堆外(但仍然在你的进程的堆中)。 只要JavaScriptvariables中的数据永远不会超过1.9 GB,一个64位的节点就可以填充所有的RAM。


所有这一切,你永远不应该接近这个极限。 处理这么多的数据时,你必须把它作为一个stream来处理。 一次不应该有超过几兆字节(最多)的内存。 好消息是节点特别适合处理stream数据。

你应该问自己一些问题:

  • 你实际从用户那里得到什么样的数据?
  • 你为什么要把它存储在JSON格式?
  • 将千兆字节填充到JSON中真的是个好主意吗? (答案是不。)
  • 数据存储后会发生什么? 你的代码会读取吗? 别的东西?

你发布的这个问题实际上对你实际要完成的事情是非常模糊的。 有关更具体的build议,更新您的问题与更多信息。

如果你期望数据永远不会那么大,只要在input上合理限制10MB或者什么东西,缓冲一切,然后使用JSON.stringify

如果您希望处理更大的数据,则需要将input直接传输到磁盘。 如果需要在数据进入磁盘之前处理/修改数据,请着手转换数据stream 。 例如,有处理stream式JSON的模块 。

“vanilla”nodeJS(v0.10.28)中的最大string大小在1GB的范围内。

如果你很匆忙,你可以用自加倍的string来testing支持的最大string大小。 testing的系统有8GB的RAM,大部分是未使用的。

 x = 'x'; while (1){ x = ''+x+x; // string context console.log(x.length); } 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 FATAL ERROR: JS Allocation failed - process out of memory Aborted (core dumped) 

在另一个testing中,我用一个字符来获得10亿次循环。

现在批评者可能会说,“等等,JSON呢,问题是关于JSON!” 我会喊在JavaScript中没有JSON对象的JStypes是对象,数组,string,数字等….和作为JSON是一个string表示这个问题归结为什么是最长的允许的string。 但是为了仔细检查,我们添加一个JSON.stringify调用来解决JSON转换问题。

 x = 'x'; while (1){ x = ''+x+x; // string context console.log(JSON.stringify({a:x}).length); } 

期望值:JSONstring的大小将会大于2,因为第一个对象将会被string化为10个字符的“{”a“:”xx“}”。 在属性a中的xstring变大之前,它不会开始加倍。 它可能会在256M左右失败,因为它可能会造成string化的第二个副本。 回想一下,string化是独立于原始对象的。

结果:

 10 12 16 24 40 72 136 264 520 1032 2056 4104 8200 16392 32776 65544 131080 262152 524296 1048584 2097160 4194312 8388616 16777224 33554440 67108872 134217736 268435464 

非常像预期的那样….

现在,这些限制可能与在nodeJS项目中实现JS的C / C ++代码有关,在这个时候,我相信它是Chrome浏览器中使用的相同的V8代码。

有人从重新编译nodeJS的人的博客文章的证据来解决旧版本的内存限制。 还有一些nodejs命令行开关。 我还没有testing过这个效果。

这是一个很好的问题,但是我认为你需要担心的上限不涉及最大的JSONstring大小。

在我看来,您需要担心的限制是您希望在处理用户请求时阻塞请求线程多长时间。

任何超过1MB的string大小都会让用户上传几秒钟,而10兆字节可能需要几分钟的时间。 收到请求后,服务器将花费几百毫秒到几秒来parsing导致非常差的用户体验的数据结构(parsingJSON 非常昂贵)

带宽和服务器处理时间将掩盖JSON对string大小可能有的任何限制。