如何快速解析很多小JSON文件?
how to quickly parse many small JSON files?
我在一个目录中有数千个非常小的 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.whosebug.com",
"http://www.whosebug.com/funny"
],
"othernested":[
{
"one": "two",
"test": "hello"
}
]
}
谢谢!
R 中有多个 JSON 库。以下是其中三个库的基准测试:
txt <- '{
"field1": "hello world",
"funny": "yes",
"date": "abc1234",
"field3": "hakuna matata",
"nestedvar": [
"http://www.whosebug.com",
"http://www.whosebug.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 reader 并且可能更高效。但是正如@Gregor 所指出的,也许您应该确保延迟确实是由于 reader.
我在一个目录中有数千个非常小的 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.whosebug.com",
"http://www.whosebug.com/funny"
],
"othernested":[
{
"one": "two",
"test": "hello"
}
]
}
谢谢!
R 中有多个 JSON 库。以下是其中三个库的基准测试:
txt <- '{
"field1": "hello world",
"funny": "yes",
"date": "abc1234",
"field3": "hakuna matata",
"nestedvar": [
"http://www.whosebug.com",
"http://www.whosebug.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 reader 并且可能更高效。但是正如@Gregor 所指出的,也许您应该确保延迟确实是由于 reader.