Car*_*rlo 13 performance for-loop r data.table
我有900000个csv文件,我想把它们组合成一个大的data.table.对于这种情况,我创建了for loop一个逐个读取每个文件并将它们添加到的文件data.table.问题是它的执行速度变慢,所用的时间呈指数级增长.如果有人可以帮助我让代码运行得更快,那就太棒了.每个csv文件都有300行和15列.我到目前为止使用的代码:
library(data.table)
setwd("~/My/Folder")
WD="~/My/Folder"
data<-data.table(read.csv(text="X,Field1,PostId,ThreadId,UserId,Timestamp,Upvotes,Downvotes,Flagged,Approved,Deleted,Replies,ReplyTo,Content,Sentiment"))
csv.list<- list.files(WD)
k=1
for (i in csv.list){
temp.data<-read.csv(i)
data<-data.table(rbind(data,temp.data))
if (k %% 100 == 0)
print(k/length(csv.list))
k<-k+1
}
Run Code Online (Sandbox Code Playgroud)
Nic*_*edy 10
假设您的文件是传统的csv,我会使用,data.table::fread因为它更快.如果您使用的是类Linux操作系统,我会使用它允许shell命令的事实.假设您的输入文件是我要执行的文件夹中唯一的csv文件:
dt <- fread("tail -n-1 -q ~/My/Folder/*.csv")
Run Code Online (Sandbox Code Playgroud)
您需要手动设置列名称.
如果你想把东西保存在R中,我会使用lapply和rbindlist:
lst <- lapply(csv.list, fread)
dt <- rbindlist(lst)
Run Code Online (Sandbox Code Playgroud)
你也可以使用plyr::ldply:
dt <- setDT(ldply(csv.list, fread))
Run Code Online (Sandbox Code Playgroud)
这样做的好处是可以用来.progress = "text"读取阅读进度.
以上所有假设文件都具有相同的格式并具有标题行.
一个建议是先将它们合并为 10 个左右的组,然后再合并这些组,依此类推。这样做的优点是,如果个别合并失败,您不会丢失所有工作。您现在的做法不仅会导致执行速度呈指数级下降,而且每次失败时都必须从头开始。
这种方式还将减少调用中涉及的数据帧的平均大小rbind,因为它们中的大多数将被附加到小数据帧,最后只有少数大数据帧。这应该消除大部分呈指数增长的执行时间。
我认为无论你做什么,都会有很多工作要做。