【发布时间】:2015-01-23 14:30:40
【问题描述】:
根文件夹是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
}
}
【问题讨论】:
-
fread通常是速度恶魔,我怀疑这不是瓶颈所在。您可以将 CSV 文件转换为 SQLite 数据库(或将它们作为表放在一个 SQLite 数据库中)吗?您可以发布您所做的foreach尝试的设置代码吗?这可能与您进行并行处理配置的方式有关。 -
@hrbrmstr 我怀疑 SQLite 是否会提供改进
-
您应该注意
fread来自data.table包。如果确实是fread。它不在基础 R 中。 -
读取一个 CSV 文件需要多长时间?然后弄清楚它是读取时间还是处理时间或循环。然后我们知道在哪里寻找优化。否则它的过早优化。
-
@y0gapants 这取决于瓶颈在哪里。您还可以使用 SQLite 强制表在内存中,这肯定会加快速度。