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