合并和附加 ffdf 数据帧列表

Merging and appending a list of ffdf dataframes

我想读取一个 CSV 文件名向量作为 ffdf 数据框,并将它们组合成一个大的 ffdf 数据框。我找到了使用其他 r 软件包的解决方案;然而,我的问题是我的数据(合并)可以达到 40GB,这肯定需要存储在磁盘上,就像 ff 包一样,而不是在 RAM 中。据我所知,这里有很棒的 solutions 使用 RAM 存储。

library(ffbase)
library(ff)

# Create list of csv files
csv_files <- list.files(path = input_path,
                        pattern="*.csv",
                        full.names = T)

# my approach so far
# this use fread, and it appears to be consuming RAM 

# Read the files in, assuming comma separator
csv_files_df <- lapply(csv_files, function(x) {
y<-unlist(str_split(x, "[.]"))[1]
    assign(y,
   as.ffdf(fread(x,stringsAsFactors = T)))})

# Combine them
combined_df <- do.call("ffdfappend", lapply(csv_files_df, as.ffdf))

当我尝试组合它们时,它会引发此错误。

> combined_df <- do.call("ffdfappend", lapply(csv_files_df, as.ffdf))
Error in ffdfappend(list(virtual = list(VirtualVmode = c("double", "integer",  : 
  'list' object cannot be coerced to type 'logical'

总结:我想只使用 ff 包来读取和合并 CSV 文件,而不需要另一个包来避免 OOM(内存不足)状态。

ffdfappend() 函数只接受两个数据参数 - xy。当你提供一个列表时,它假设一些数据框是 ffdfappend() 的其他参数。要按照您想要的方式使用此函数,您可能需要将其写在一个循环中,如下所示:

csv_files <- list.files(path = input_path,
                        pattern="*.csv",
                        full.names = T)

# my approach so far
# this use fread, and it appears to be consuming RAM 

read <- function(x) {
  y<-unlist(str_split(x, "[.]"))[1]
  assign(y,
         as.ffdf(fread(x,stringsAsFactors = T)))}

# Read the files in, assuming comma separator
out <- read(csv_files[1])

for(i in 2:length(csv_files)){
  out <- ffdfappend(out, read(csv_files(i)))
}