在R中释放内存

在R中释放内存,r,garbage-collection,R,Garbage Collection,在R中,我尝试将几组timeseries数据合并并转换为xts,但是,这些文件很大,而且有很多文件,因此这会导致我的笔记本电脑出现问题。它们存储为csv文件,并已压缩为zip文件 下载和解压它们很容易(尽管会占用硬盘上的大量空间) 使用data.table包中的新fread()函数,将一个月的数据的350MB以上的文件加载到R中相当简单 一些数据表转换是在函数内部完成的,这样可以轻松读取时间戳并生成中间列。然后,datatable将保存为硬盘上的RData文件,所有对datatable对象的引用

在R中,我尝试将几组timeseries数据合并并转换为xts,但是,这些文件很大,而且有很多文件,因此这会导致我的笔记本电脑出现问题。它们存储为csv文件,并已压缩为zip文件

下载和解压它们很容易(尽管会占用硬盘上的大量空间)

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

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


我知道我可以按顺序下载每个文件,转换它,保存它,关闭R并重复,直到我有一堆RData文件可以加载和绑定,但我希望有一种更有效的方式来实现这一点,这样在删除对datatable的所有引用后,您会恢复到非“正常”或RAM使用的启动级别。有没有比gc()清除内存更好的方法?任何建议都将不胜感激。

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

  • 在单独的
    R
    脚本中隔离内存不足的操作
  • 在执行后销毁的新进程中运行每个脚本。因此,系统会将使用过的内存返回
  • 通过文本文件将参数传递给脚本
  • 考虑下面的玩具示例

    数据生成:

    setwd("/path/to")
    write.table(matrix(1:5e7, ncol=10), "temp.csv") # 465.2 Mb file
    
    从.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)
    
    setwd(“/path/to”)
    库(数据表)
    #简单处理
    
    f如果您使用
    read.csv
    而不是
    fread
    ,您是否有相同的症状?这似乎与使用
    x@redmode有关。我同意,这可能与您将链接放在运行“gc()的建议解决方案”的问题有关很多时候,在降低RAM使用率方面似乎没有多大帮助…+1,但是
    read.csv(infle)
    没有使用
    colClasses
    ,因此可能是因为这个原因,以及其他原因导致内存不足。您是否在R-Forge上的
    data.table
    v1.8.7中尝试了新的
    fread
    功能?用户报告它很成功。@MatthewDowle:是的,我试过
    fread
    ,发现它非常适合我的需要。但是,好的,当前的CRAN
    数据。表中没有它吗?所以我决定把safe
    read.table
    write.table
    放在这里。@MatthewDowle:更重要的是,@h.l.m在使用
    fread
    时报告了内存问题。所以,这不是我回答的重点。基本的想法是在不同的进程中运行内存不足的任务,以确保内存恢复。好的,谢谢,我没有意识到这一点。例如,如果
    read.csv
    读入字符向量,然后强制为
    integer
    double
    (当未提供
    colClases
    时,所有这些字符值都将缓存在R的全局字符串缓存中。据我所知,缓存只会增长(不受
    gc()
    的影响)。因此,您确实希望通过设置
    colClasses
    或使用
    fread
    来避免这种情况。否则就很难追踪到底发生了什么。若h.l.m.已经在使用
    fread
    ,那个么我将不得不再次研究这个问题。谢谢@redmode伟大的解决方案!很好用!一个很好的释放内存的小技巧!特别是与
    fread()
    组合使用时,再次感谢@MatthewDowle制作了它!
    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")
    }