Как быстро разобрать много маленьких файлов 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, возможно, вам следует убедиться, что задержка действительно связана с читателем.

Другие вопросы по тегам