释放R中的记忆

时间:2013-01-22 01:15:59

标签: r garbage-collection

在R中,我试图将几组时间序列数据组合并转换为来自http://www.truefx.com/?page=downloads的xts但是,文件很大且有很多文件,所以这导致我的笔记本电脑出现问题。它们存储为csv文件,已压缩为zip文件。

下载它们并解压缩它们很容易(尽管在硬盘驱动器上占用了大量空间)。

使用fread()包中新的data.table函数,将一个月的350MB +文件加载到R中是相当简单的。

完成了一些数据表转换(在函数内部),以便可以轻松读取时间戳并生成中间列。然后将数据表保存为硬盘驱动器上的RData文件,并从工作空间中删除对数据表对象的所有引用,并在删除后运行gc() ...但是在查看R会话时我的活动监视器(从Mac运行)...它看起来仍然占用了近1GB的RAM ...而且事情看起来有点滞后......我打算加载几年的csv文件同时,将它们转换为可用的数据表,组合它们然后创建一个xts对象,如果仅仅一个月使用1GB的RAM,这似乎是不可行的。

我知道我可以顺序下载每个文件,转换它,保存它关闭R并重复,直到我有一堆RData文件,我可以加载和绑定,但希望可能有一个更有效的方式做这样,在删除对数据表的所有引用后,您将返回“正常”或启动级别的RAM使用情况。清除内存的方法是否比gc()更好?任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:7)

在我的项目中,我不得不处理许多大文件。我按照以下原则组织了例程:

  1. 在单独的R脚本中隔离需要大量内存的操作。
  2. 在新进程中运行每个脚本,执行后将其销毁。因此,系统会重新使用内存。
  3. 通过文本文件将参数传递给脚本。
  4. 考虑下面的玩具示例。

    数据生成:

    setwd("/path/to")
    write.table(matrix(1:5e7, ncol=10), "temp.csv") # 465.2 Mb file
    

    slave.R - 消耗内存的部分

    setwd("/path/to")
    library(data.table)
    
    # simple processing
    f <- function(dt){
      dt <- dt[1:nrow(dt),]
      dt[,new.row:=1]
      return (dt)
    }
    
    # reads parameters from file
    csv <- read.table("io.csv")
    infile  <- as.character(csv[1,1])
    outfile <- as.character(csv[2,1])
    
    # memory-hungry operations
    dt <- as.data.table(read.csv(infile))
    dt <- f(dt)
    write.table(dt, outfile)
    

    master.R - 在单独的进程中执行从属

    setwd("/path/to")
    
    # 3 files processing
    for(i in 1:3){
      # sets iteration-specific parameters
      csv <- c("temp.csv", paste("temp", i, ".csv", sep=""))
      write.table(csv, "io.csv")
    
      # executes slave process
      system("R -f slave.R")
    }