2014-04-15 19 views
0

我正在从提供程序下载不同大小的json数据。大小可以从几百字节到几十MB不等。缓冲区或字符串或数组用于添加与json的区块

遇到了一个字符串问题(即stringVar + = chunk)。我不确定,但我怀疑我的崩溃必须使用相当大的字符串(15 MB)。

最后我需要json数据。我的临时解决方案是使用高达1MB的字符串,然后将其“冲洗”到缓冲区。我不想在开始时使用缓冲区,因为当下载量很小时,它经常会增长(即复制到更大的缓冲区)。

哪个解决方案最适合连接下载的块,然后解析为json?

1.

var dataAsAString = ''; 
.. 
dataAsAString += chunk; 
.. 
JSON.parse(dataAsAString); 

2.

var dataAsAnArray = []; 
.. 
dataAsAnArray.push(chunk); 
.. 
concatenate 
JSON.parse.. 

3.

var buffer = new Buffer(initialSize) 
.. 
buffer.write(chunk) 
.. 
copy buffer to larger buffer when needed 
.. 
JSON.parse(buffer.toString()); 

迈克尔

回答

0

我不知道你为什么在累积附加块方式。

如果您可以在整个数据处理过程中存储必要的元数据,那么您可以使用循环并仅处理该块。应该在循环中声明块数据,然后在每次迭代之后,块变量超出范围,并且使用的内存不会持续增长。

while((chunk=receiveChunkedData())!=null) 
{ 
JSON.parse(chunk); 
} 
+0

有趣。对不起,我对http.get很陌生。但我想知道,JSON.parse如何应对小块,一个接一个不会描述有效的json对象? – Michael

+0

试过了。正如我怀疑这不是一个前进的方向。当抛出不代表有效json的小字符串时,JSON.parse会变得困惑。 – Michael

+0

这就是为什么我说,元数据也需要与每个块一起使其有效的JSON。 – RRM

0

我现在已经转移到流而不是积累缓冲区。流真的很棒。

如果有人来这里为在迅速地积累缓冲块的解决方案,我想我会分享我的查找..

亚组具有保持所有块分开,而不重新分配内存,然后把他们一个模块作为一个连续的缓冲区,当你需要时。

https://github.com/substack/node-buffers

相关问题