json 合并非常大(数千)非常小的文件

aor9mmx1  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(90)

我需要合并几批非常大量的小文件(为每个用户收集我的项目推文)。大的数字是大约50,000个文件:(
我没有一个特别的问题与代码,但我的R只是得到“冻结”在合并,即使我保持文件在10000号。
我使用的代码是:

files <-   list.files(
     path = file.path(path),
     pattern = pattern,
     recursive = TRUE,
     include.dirs = TRUE,
     full.names = TRUE   )

json.data_all <- data.frame()

for (i in seq_along(files)) {   
  filename <- files[[i]]  
  json.data <- jsonlite::read_json(filename, simplifyVector = TRUE)  
 json.data_all <- dplyr::bind_rows(json.data_all, json.data) 
 }

我有几个这样的文件夹..我该如何解决这个问题?

webghufk

webghufk1#

不要在for循环中按行绑定或以其他方式增加数据,这非常慢。
尝试类似下面的方法。

files <- list.files(path = file.path(path), pattern = pattern, recursive = TRUE, include.dirs = TRUE, full.names = TRUE)

json.data_all <- lapply(files, jsonlite::read_json, simplifyVector = TRUE)
json.data_all <- data.table::rbindlist(json.data_all)
dim(json.data_all)
qij5mzcb

qij5mzcb2#

通常更容易和更快的方法是创建一个所有 Dataframe 的列表,然后在循环之后使用bind_rows一次性合并整个列表。
R不能很好地处理内存,因此for()循环中的常量绑定在创建和删除不断增长的数据结构时变得非常慢。
类似这样的方法应该可以奏效:

files <- list.files( path = file.path(path), pattern = pattern, recursive = TRUE, include.dirs = TRUE, full.names = TRUE )

json.data <- lapply(files, function(file){
   jsonlite::read_json(file, simplifyVector = TRUE)
})
json.data_all <- dplyr::bind_rows(json.data)
bmp9r5qi

bmp9r5qi3#

下面的代码应该可以解决您的问题,而且由于线程化,执行速度也会很快

library("parallel")
library("foreach")
library("doParallel")

cluster1 = makeCluster(detectCores(logical=FALSE), type="PSOCK", outfile="")
registerDoParallel(cluster1)

files <-   list.files( path = file.path(path), pattern = pattern, recursive = TRUE, include.dirs = TRUE, full.names = TRUE )
dataList = foreach(file=files) %dopar% {
    jsonlite::read_json(file.path(path, file1), simplifyVector = TRUE) 
}
json.data_all = data.table::rbindlist(dataList)

stopCluster(cluster1)

相关问题