【问题标题】:how to quickly parse many small JSON files? [closed]如何快速解析许多小的 JSON 文件? [关闭]
【发布时间】:2019-08-23 18:33:19
【问题描述】:

我在一个目录中有数千个非常小的 json 文件。

现在,我正在使用以下代码来加载它们:

library(dplyr)
library(jsonlite)
library(purrr)

filelistjson <- list.files(DATA_DIRECTORY, full.names = TRUE, recursive = TRUE)
filelistjson %>% map(., ~fromJSON(file(.x)))

不幸的是,这非常慢(我也尝试过furrr::future_map)我想知道这里是否有更好的方法。单个文件的大小几乎没有 25KB...

文件如下所示,有几个嵌套变量,但没有太复杂

  {
 "field1": "hello world",
  "funny": "yes",
  "date": "abc1234",
  "field3": "hakuna matata",
  "nestedvar":[
    "http://www.stackoverflow.com",
    "http://www.stackoverflow.com/funny"
  ],
  "othernested":[
   { 
     "one": "two",
     "test": "hello"
   }
   ] 
  }

谢谢!

【问题讨论】:

  • 您可以添加至少一个文件的示例并指定您使用的软件包吗?
  • 请查看更新后的问题。谢谢!
  • 您的 JSON 有缺陷 - 将 = 切换为 : 并且您忘记了一个元素或有一个不需要的逗号。
  • @niko,谢谢,我已修正错字
  • 你的操作系统是什么?

标签: r json purrr jsonlite furrr


【解决方案1】:

R 中有几个 JSON 库。以下是其中三个库的基准测试:

txt <- '{
 "field1": "hello world",
"funny": "yes",
"date": "abc1234",
"field3": "hakuna matata",
"nestedvar": [
"http://www.stackoverflow.com",
"http://www.stackoverflow.com/funny"
],
"othernested": [
{ 
"one" : "two",
"test" : "hello"
}
] 
}'

microbenchmark::microbenchmark(
  jsonlite={
    jsonlite::fromJSON(txt)
  },
  RJSONIO={
    RJSONIO::fromJSON(txt)
  },
  rjson={
    rjson::fromJSON(txt)
  }
)

# Unit: microseconds
#     expr     min       lq      mean  median      uq     max neval cld
# jsonlite 144.047 153.3455 173.92028 167.021 172.491 456.935   100   c
#  RJSONIO 113.049 120.3420 134.94045 128.365 132.742 287.727   100  b 
#    rjson  10.211  12.4000  17.10741  17.140  18.234  59.807   100 a 

如您所见,rjson 似乎更有效(尽管谨慎对待上述结果)。就我个人而言,我喜欢使用 RJSONIO,因为根据我的经验,它是在再次阅读、修改和解析时最尊重格式的库。

最后,如果您知道文件的(不变的)结构,您始终可以构建自定义 JSON 阅读器,并且可能会更高效。但正如@Gregor 所指出的,也许您应该确保延迟确实是由于阅读器造成的。

【讨论】:

  • 非常有趣。他们都可以使用file 参数吗?在这里你正在加载一个字符串。
  • 我对差异的幅度感到惊讶,但是当时间以微秒为单位并且 OP 有“数千”个这些文件(而不是数百万个)时,加起来仍然不是很多时间。从磁盘读取很可能是瓶颈,而不是解析 JSON。
  • 不同的方法与 txt 参数的作用相似:它可以是本地文件,网络上的文件等。但是,结果的存储方式不同:jsonlite 与数据帧,而RJSONIO 更多地用于列表。 @Gregor 是的,这是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多