我的Node.js应用程序的一部分涉及从用户接收一个字符串作为输入,并将其存储在一个JSON文件中。JSON本身显然对此没有限制,但是Node可以处理成JSON的文本数量有上限吗?
请注意,我没有使用MongoDB或任何其他技术进行实际插入-这是本机字符串化,并使用fs
保存到.json文件。
发布于 2014-06-11 11:27:35
"vanilla“nodeJS (v0.10.28)中的最大字符串大小约为1 1GB。
如果您很着急,您可以使用自加倍字符串测试支持的最大字符串大小。测试的系统有8 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)
在另一个测试中,我使用for循环一次一个字符达到了1,000,000,000。
现在,评论家可能会说,“等等,JSON呢?问题是关于JSON的!”我要说的是,JAVASCRIPT中没有JSON对象,JS类型有Object、Array、String、Number等。由于JSON是一个字符串表示,这个问题可以归结为允许的最长字符串。但为了仔细检查,让我们添加一个JSON.stringify调用来处理JSON转换。
代码
x = 'x';
while (1){
x = ''+x+x; // string context
console.log(JSON.stringify({a:x}).length);
}
期望: JSON字符串的大小将从2开始,因为第一个对象将字符串表示为'{"a":"xx"}‘,持续10个字符。在属性a中的x字符串变得更大之前,它不会开始加倍。它可能会在2.56亿左右失败,因为它可能会在字符串化中复制第二个副本。回想一下,字符串化独立于原始对象。
结果:
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命令行开关。我还没有测试过这一切的效果。
发布于 2020-02-21 08:03:35
node.js中字符串的最大长度是由底层的Javascript引擎"V8“定义的。在V8中,最大长度与堆大小无关。字符串的大小实际上受到优化对象布局定义的限制的约束。参见https://chromium-review.googlesource.com/c/v8/v8/+/2030916,这是最近(2020年2月)对V8中字符串的最大长度的更改。提交消息解释了随时间变化的不同长度。限制从大约256MB到1 1GB,然后又回到512MB (在64位V8平台上)。
发布于 2014-06-11 11:34:12
这是一个很好的问题,但我认为您需要担心的上限不涉及最大JSON字符串大小。
在我看来,您需要担心的限制是,当请求线程处理用户的请求时,您希望阻塞请求线程多长时间。
任何超过1MB的字符串大小都会花费用户几秒钟的时间来上传,10兆字节的字符串可能需要几分钟的时间。收到请求后,服务器需要几百毫秒到几秒的时间来解析成数据结构,这会导致非常差的用户体验(解析JSON非常昂贵)
带宽和服务器处理时间将掩盖JSON对字符串大小的任何限制。
https://stackoverflow.com/questions/24153996
复制相似问题