怎么读大json?

时间:2011-11-21 18:36:07

标签: c++ c json r

我收到了带有要在R中分析的数据的json文件,我使用了RJSONIO包:

library(RJSONIO)
filename <- "Indata.json"
jFile <- fromJSON(filename)

当json文件大于约300MB(未压缩)时,我的计算机开始使用交换内存并继续解析(fromJSON)数小时。一个200MB的文件只需要一分钟就可以解析。

我在Ubuntu 64bit和16GB RAM上使用R 2.14(64位),所以我很惊讶需要交换大约300MB的json。

我能做些什么来阅读大jsons?内存设置中有什么东西搞砸了吗?我已重新启动R并仅运行上面的三行。 json文件包含2-3列短字符串,10-20列包含0到1000000之间的数字。它是产生大尺寸的行数(在解析数据中超过一百万行)。


更新:从评论中我了解到rjson在C中做得更多,所以我试了一下。带有RJSONIO(根据Ubuntu系统监视器)的300MB文件达到了100%的内存使用率(从6%基线开始)并继续交换,只需要60%的内存和rjson包,并且在合理的时间(分钟)内完成解析。

3 个答案:

答案 0 :(得分:6)

虽然您的问题没有指定此详细信息,但您可能希望确保在内存中加载整个JSON实际上是您想要的。看起来RJSONIO是一个基于DOM的API。

您需要做什么计算?你能用流解析器吗? JSON的类SAX流式解析器的示例是yajl

答案 1 :(得分:2)

尽管问题很严重,但这可能对有类似问题的人有用。

函数jsonlite::stream_in()允许定义pagesize来设置一次读取的行数,并且每次迭代中应用于此子集的自定义函数可以作为{{1}提供}。这允许使用非常大的JSON文件,而无需同时将所有内容读入内存。

handler

答案 2 :(得分:0)

不是内存大小,而是速度,对于非常小的iris数据集(仅7088字节),RJSONIO包比rjson慢一个数量级。除非你真的需要,否则不要使用方法'R'!请注意两组结果中的不同单位。

library(rjson) # library(RJSONIO)
library(plyr)
library(microbenchmark)
x <- toJSON(iris)
(op <- microbenchmark(CJ=toJSON(iris), RJ=toJSON(iris, method='R'),
  JC=fromJSON(x), JR=fromJSON(x, method='R') ) )

# for rjson on this machine...
Unit: microseconds
  expr        min          lq     median          uq        max
1   CJ    491.470    496.5215    501.467    537.6295    561.437
2   JC    242.079    249.8860    259.562    274.5550    325.885
3   JR 167673.237 170963.4895 171784.270 172132.7540 190310.582
4   RJ    912.666    925.3390    957.250   1014.2075   1153.494

# for RJSONIO on the same machine...
Unit: milliseconds
  expr      min       lq   median       uq      max
1   CJ 7.338376 7.467097 7.563563 7.639456 8.591748
2   JC 1.186369 1.234235 1.247235 1.265922 2.165260
3   JR 1.196690 1.238406 1.259552 1.278455 2.325789
4   RJ 7.353977 7.481313 7.586960 7.947347 9.364393