Javascript 使用Node.js的JSON中字符串的大小是否有限制?
my Node.js应用程序的一部分涉及从用户接收字符串作为输入,并将其存储在JSON文件中。JSON本身显然对此没有限制,但节点可以处理成JSON的文本量有上限吗Javascript 使用Node.js的JSON中字符串的大小是否有限制?,javascript,json,node.js,Javascript,Json,Node.js,my Node.js应用程序的一部分涉及从用户接收字符串作为输入,并将其存储在JSON文件中。JSON本身显然对此没有限制,但节点可以处理成JSON的文本量有上限吗 请注意,我没有使用MongoDB或任何其他技术进行实际插入-这是本机字符串化,并使用fs保存到.json文件中,“香草”nodeJS(v0.10.28)中的最大字符串大小大约为1GB 如果您有急事,可以使用自加倍字符串测试支持的最大字符串大小。测试的系统有8GB的RAM,大部分未使用 x = 'x'; while (1){
请注意,我没有使用MongoDB或任何其他技术进行实际插入-这是本机字符串化,并使用
fs
保存到.json文件中,“香草”nodeJS(v0.10.28)中的最大字符串大小大约为1GB
如果您有急事,可以使用自加倍字符串测试支持的最大字符串大小。测试的系统有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)
在另一个测试中,我得到了100000000个字符,每次循环一个字符
现在评论家可能会说,“等等,JSON呢,问题是JSON!”我会说JAVASCRIPT中没有JSON对象,JS类型是Object、Array、String、Number等等。。。。由于JSON是一种字符串表示,这个问题归结为允许的最长字符串是什么。但为了再次检查,让我们添加一个JSON.stringify调用来处理JSON转换
代码
期望值: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代码相同
有证据表明,人们通过重新编译nodej来绕过旧版本中的内存限制。还有许多nodejs命令行开关。我还没有测试过这一切的效果 在“香草”节点(v0.10.28)中,最大字符串大小大约为1GB 如果您有急事,可以使用自加倍字符串测试支持的最大字符串大小。测试的系统有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)
在另一个测试中,我得到了100000000个字符,每次循环一个字符
现在评论家可能会说,“等等,JSON呢,问题是JSON!”我会说JAVASCRIPT中没有JSON对象,JS类型是Object、Array、String、Number等等。。。。由于JSON是一种字符串表示,这个问题归结为允许的最长字符串是什么。但为了再次检查,让我们添加一个JSON.stringify调用来处理JSON转换
代码
期望值: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代码相同
有证据表明,人们通过重新编译nodej来绕过旧版本中的内存限制。还有许多nodejs命令行开关。我还没有测试过这一切的效果 这是一个好问题,但我认为您需要担心的上限并不涉及JSON字符串的最大大小 在我看来,您需要担心的限制是,在处理用户请求时,您希望阻止请求线程多长时间 任何超过1MB的字符串都需要用户几秒钟的上传时间,10兆字节可能需要几分钟。在接收到请求后,服务器需要几百毫秒到几秒钟的时间来解析数据结构,从而导致非常糟糕的用户体验(解析JSON非常昂贵)
带宽和服务器处理时间将掩盖JSON对字符串大小的任何限制。这是一个好问题,但我认为您需要担心的上限不包括JSON字符串的最大大小 在我看来,您需要担心的限制是,在处理用户请求时,您希望阻止请求线程多长时间 任何超过1MB的字符串都需要用户几秒钟的上传时间,10兆字节可能需要几分钟。在接收到请求后,服务器需要几百毫秒到几秒钟的时间来解析数据结构,从而导致非常糟糕的用户体验(解析JSON非常昂贵) 带宽和服务器处理时间将掩盖JSON对字符串大小的任何限制。V8(JavaScript引擎节点就是基于此构建的)直到最近才有了一个 节点v0.10在旧版本的V8(3.14)上被卡住,这是由于破坏了本机插件周围的V8 API更改。节点0.12将更新到最新的V8(3.26),这将打破许多本机模块,但为提高1.9 GB堆限制打开了大门 因此,单节点进程最多只能保存1.9GB的JavaScript代码、对象、字符串等。这意味着字符串的最大长度小于1.9 GB 您可以通过使用
Buffer
s来解决这个问题,它将数据存储在V8堆之外(但仍在进程堆中)。只要JavaScript变量中的数据不超过1.9GB,64位的节点构建几乎可以填满所有RAM
尽管如此,你永远不应该接近这个极限。在处理这么多数据时,您必须将其作为流处理。您的存储容量不应超过几兆字节(a)