我有一个工作循环,可从不同文件夹(已知位置)中读取文本文件(未知名称),并更新这些文本文件列,并以相同的名称再次保存在同一文件夹中
folders <- c(1,2,3)
for(i in seq_along(folders)){
dt <- df[(df$id ==folders[i]),]
dt$id <- NULL
loc <- paste0("data/", folders[i])
setwd(loc)
file.names <- list.files(pattern = "*.txt$", all.files = FALSE,
full.names = FALSE, recursive = FALSE,
ignore.case = FALSE)
for(j in seq_along(file.names)){
text <- read.csv(file.names[j], header = F, stringsAsFactors = F)
text2 <- merge(text, dt, by.x = "matched", by.y = "matched", all.x = T)
write.table(text2, file.names[j], sep = ",", na="",
row.names = FALSE, quote = TRUE, col.names = F)
rm(text,text2)
print(j)
}
}
我面临两个问题,第一个非常慢,第二个它使用过多的内存/内存。尝试自己动手,但对R的了解不多。可以通过创建一些函数来提高速度,并且“如果简单地用总长度初始化向量(具有NA,零或任何其他值),然后运行循环,我们可以大大提高算法的速度”。我希望自己可以做类似的事情。
我会在整个循环中建议一些打印语句,并查看在哪里消耗时间。
您正在使用基本R函数。尝试使用dplyr::left_join()
而不是merge
(dplyr
往往在后台运行c++
,因此比基本R中的等效函数快约100倍)。您也可以尝试一些data.table
functions
data.table
删除对象,但实际上并未释放内存。调用rm()
after gc()
将释放现在删除的对象占用的大部分内存。因此,请在调用rm()
之后尝试放置gc()
。
向量预分配有帮助,因为它减少了R在组合向量时制作向量副本的需要。在这里这似乎不是问题(因为您的代码未结合向量)。