如何读取大型的JSON文件?

16

我接收包含需要在R中分析的数据的JSON文件,我使用RJSONIO软件包进行分析:

library(RJSONIO)
filename <- "Indata.json"
jFile <- fromJSON(filename)
当JSON文件超过约300MB(未压缩)时,我的计算机开始使用交换内存,并继续对JSON进行解析(从JSON中)。200MB的文件仅需要约一分钟来解析。我在Ubuntu 64位上使用R 2.14(64位),具有16GB RAM,因此我感到惊讶,在大约300MB的JSON中就已经需要交换了。
我该怎么办才能读取大JSON?是否有在内存设置方面搞砸事情的东西?我已重启R并仅运行了上面的三行代码。JSON文件包含2-3列短字符串和10-20列数字(从0到1000000)。即,是行数使数据变得很大(在解析后的数据中有超过一百万行)。
更新:从评论中我了解到rjson更多地是用C完成的,所以我试了一下。一个300MB的文件,在RJSONIO中(根据Ubuntu系统监视器)达到了100%的内存使用量(从6%的基线),并继续交换,而使用rjson包只需要60%的内存,并且解析在合理的时间内完成(几分钟)。

1
我没有处理那么大的远程json文件的经验,但你可以看看rjson包,它有同名函数。据说它比RJSONIO更快。 - joran
1
是的,rjson包含更多的C代码,因此速度可能会更快,而且很可能更节省内存...尽管我也没有使用过它。 - JD Long
4
这里有人没有说实话(“这里”指的是软件包“Description”)。事实上,“RJSONIO”宣传自己的速度表现:“这是rjson软件包的替代品。那个版本转换大型R对象为JSON太慢了,也不可扩展,但是非常有用的原型。它解析速度很快。” 那么,“RJSONIO”或“rjson”哪一个解析速度更快?是否有任何性能测试结果呢? - aL3xa
顺便说一下,对我来说RJSONIO效果更好。但是我的json文件很小,不到1MB。rjson需要几秒钟的时间,而RJSONIO则瞬间完成。因此,RJSONIO关于速度表现的描述对我来说是正确的。此外,当我在Notepad++中打开rjson的输出文件时,它不可读。第三,我真的不知道为什么rjson不能将其生成的输出读回R?我的数据结构是一个由字符向量(可能为空)组成的嵌套列表。无论如何,我认为轻松切换以找出更适合您目的的包是相当容易的。 - 楊祝昇
我知道这个问题很老了,但是对于那些正在搜索互联网的人,请看一下这里发布的基准测试:https://dev59.com/CGUp5IYBdhLWcg3wY25V - Ricardo Saporta
3个回答

6
尽管您的问题没有指定这个细节,但您可能希望确保在内存中加载整个JSON确实是您想要的。看起来RJSONIO是基于DOM的API。
您需要执行什么计算?您可以使用流解析器吗?JSON的类SAX流解析器示例是yajl

2

即使这个问题很老了,但这可能对某些遇到类似问题的人有用。

jsonlite::stream_in()函数允许定义pagesize以设置每次读取的行数,并且可以提供一个自定义函数作为handler在每次迭代中应用于该子集。这使得能够处理非常大的JSON文件,而不需要一次将所有内容都读入内存。

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

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

请检查结果的“单位” ;) - daroczig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接