怎么读大json?

我收到了带有要在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包,并且在合理的时间(分钟)内完成解析。

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

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

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

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

 stream_in(con, pagesize = 5000, handler = function(x){ # Do something with the data here }) 

不是内存大小,而是速度,对于相当小的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