Как быстро разобрать много маленьких файлов JSON?
У меня тысячи очень маленьких 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.stackru.com",
"http://www.stackru.com/funny"
],
"othernested":[
{
"one": "two",
"test": "hello"
}
]
}
Спасибо!
1 ответ
В R. есть несколько библиотек JSON. Вот тесты для трех библиотек:
txt <- '{
"field1": "hello world",
"funny": "yes",
"date": "abc1234",
"field3": "hakuna matata",
"nestedvar": [
"http://www.stackru.com",
"http://www.stackru.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, возможно, вам следует убедиться, что задержка действительно связана с читателем.