根文件夹是D:/data/
。在这个根文件夹中有许多子文件夹。 CSV文件存储在子文件夹中,例如
D:/data/
f1
1.csv
2.csv
f2
1.csv
2.csv
我使用以下代码来读取我的CSV文件。但是,读取大约20,000个CSV文件需要几个小时。
allFolders = list.files("D:/data/")
for(folder in 1:length(allFolders))
{
dirPath = paste0("D:/data/", allFolders[folder], '/')
for(i in 1:100)
{
f = fread(paste0(dirPath, i, ".csv"))
# data processing
}
}
任何想法如何在Windows上加速此过程?我尝试使用foreach
软件包,但由于I / O设备的速度限制,性能几乎相同。
更新
这是我实施foreach
的方式:
allFolders = list.files("D:/data/")
for(folder in 1:length(allFolders))
{
allf <- vector(mode = "list", length = 100)
allf <- foreach(i=1:100, .combine=rbind)
{
f = data.table::fread(paste0(dirPath, i, ".csv"))
f
}
}
答案 0 :(得分:1)
lapply
或sapply
代替for循环可能有所帮助。
进一步补充: 也许找出一种清理数据的方法。在20,000个不同的.csv文件中存储数据似乎效率极低。当我使用大型数据集(无论是文件数量还是大小)时,我尝试清理多个步骤,并仅在.rds文件中保存我需要的数据,以便于读入R。
allFolders = list.files("D:/data/")
folders_as_list <- lapply(1:length(allFolders), function(i){
dirPath <- file.path("D:/data/", allFolders[i])
res <- lapply(1:100, function(j){
f <- fread(paste0(dirPath, j, ".csv"))
[DATA PROCESSING]
return(f_processed)
}) %>% rbind_all
return(res)
})
哪个应该返回1:length(allFolders)的列表,其中列表中的每个元素都是data.frame,其中单个文件夹中的所有单个.csv文件已经被绑定在一起。