在R中进行内存预分配的循环读取/写入

问题描述 投票:0回答:1

我有一个工作循环,可从不同文件夹(已知位置)中读取文本文件(未知名称),并更新这些文本文件列,并以相同的名称再次保存在同一文件夹中

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 for-loop memory-management
1个回答
0
投票

寻址速度

我会在整个循环中建议一些打印语句,并查看在哪里消耗时间。

寻址内存(和速度)

您正在使用基本R函数。尝试使用dplyr::left_join()而不是mergedplyr往往在后台运行c++,因此比基本R中的等效函数快约100倍)。您也可以尝试一些data.table functions

data.table删除对象,但实际上并未释放内存。调用rm() after gc()将释放现在删除的对象占用的大部分内存。因此,请在调用rm()之后尝试放置gc()

关于向量预分配

向量预分配有帮助,因为它减少了R在组合向量时制作向量副本的需要。在这里这似乎不是问题(因为您的代码未结合向量)。

© www.soinside.com 2019 - 2024. All rights reserved.