如何加速 R 中的 CSV 文件读取
How to accelerate CSV file reading in R
根文件夹是 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
}
}
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)
})
return 1:length(allFolders) 的列表,其中列表中的每个元素都是一个 data.frame,其中单个文件夹中的所有单个 .csv 文件都已r绑定在一起。
根文件夹是 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
}
}
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)
})
return 1:length(allFolders) 的列表,其中列表中的每个元素都是一个 data.frame,其中单个文件夹中的所有单个 .csv 文件都已r绑定在一起。