Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Node.js的JSON中字符串的大小是否有限制?_Javascript_Json_Node.js - Fatal编程技术网

Javascript 使用Node.js的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){

my Node.js应用程序的一部分涉及从用户接收字符串作为输入,并将其存储在JSON文件中。JSON本身显然对此没有限制,但节点可以处理成JSON的文本量有上限吗


请注意,我没有使用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)