【问题标题】:How to read big json?如何读取大 json?
【发布时间】:2011-11-21 18:36:07
【问题描述】:

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

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

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

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

我可以做些什么来阅读大的 json?内存设置中有什么东西把事情搞砸了吗?我已经重新启动了 R 并且只运行了上面的三行。 json 文件包含 2-3 列短字符串和 10-20 列数字从 0 到 1000000。即它是大尺寸的行数(解析数据中超过一百万行)。


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

【问题讨论】:

  • 我没有任何远程处理这么大的 json 文件的经验,但您可能会查看具有相同名称函数的 rjson 包。我听说它可以比RJSONIO 更快。
  • 是的,rjson 包有更多的 C 代码,因此会更快并且可能更节省内存......虽然我也没有这方面的经验。
  • 这里有人没有说实话(这里=包Description)。 RJSONIO 实际上宣传它的速度性能:This is an alternative to rjson package. That version was too slow for converting large R objects to JSON and is not extensible, but a very useful prototype. It is fast for parsing.。现在,what 的解析速度很快 - RJSONIOrjson?是否有任何性能测试?
  • 好吧,仅供参考,RJSONIO 更适合我吗?但我的只是一个
  • 我知道这个问题很老了,但是对于那些正在搜索互联网的人,请看看这里发布的基准:stackoverflow.com/questions/15308435/…

标签: c++ c json r


【解决方案1】:

虽然您的问题没有具体说明这一细节,但您可能希望确保将整个 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
    })
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 请同时检查结果的Unit ;)
      猜你喜欢
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2016-11-17
      • 2018-04-14
      • 2018-07-21
      相关资源
      最近更新 更多