R在.jsonl文件中的读取速度非常慢

时间:2019-10-21 15:11:18

标签: r rjson jsonlines

我需要将.jsonl文件读取到R中,并且运行非常缓慢。对于一个67,000行的文件,它花费了10分钟以上的时间来加载。这是我的代码:

library(dplyr)
library(tidyr)
library(rjson)

f<-data.frame(Reduce(rbind, lapply(readLines("filename.jsonl"),fromJSON)))
f2<-f%>%
  unnest(cols = names(f))

这是.jsonl文件的示例

{"UID": "a1", "str1": "Who should win?", "str2": "Who should we win?", "length1": 3, "length2": 4, "prob1": -110.5, "prob2": -108.7}
{"UID": "a2", "str1": "What had she walked through?", "str2": "What had it walked through?", "length1": 5, "length2": 5, "prob1": -154.6, "prob2": -154.8}

所以我的问题是: (1)为什么需要这么长时间才能运行,以及(2)我该如何解决?

2 个答案:

答案 0 :(得分:2)

我认为读取json行文件的最有效方法是使用 jsonlite 包中的stream_in()函数。 stream_in()需要输入connection,但是您可以使用以下功能读取普通文本文件:

read_json_lines <- function(file){
  con <- file(file, open = "r")
  on.exit(close(con))
  jsonlite::stream_in(con, verbose = FALSE)
}

答案 1 :(得分:0)

您还可以签出ndjson。它是Niels Lohmann的超级方便的C ++ json库的包装。界面类似于jsonlite:

df <- ndjson::stream_in('huge_file.jsonl')

或者,您可以并行化它。当然,这取决于您的特定设置(例如CPU,HDD,文件),但是您可以尝试一下。我经常在BigQuery转储上工作。如果表较大,则输出将在文件之间分割。这样就可以在文件级别对其进行并行化(并行读取和解析多个文件并合并输出):

library(furrr)

# my machine has more than 30 cores and a quite fast SSD
# Therefore, it utilises all 20 cores
plan(multisession, workers = 20)

df <- future_map_dfr(
   # this returns a list containing all my jsonline files
   list.files(path = "../data/panel", pattern="00*", full.names=T),
   # each file is parsed separately 
   function(f) jsonlite::stream_in(file(f))
)