释放R中的记忆

h.l*_*l.m 6 garbage-collection r

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

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

将一个月的350MB +文件加载到R中,可以合理地直接使用包中的新fread()功能data.table.

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

我知道我可以顺序下载每个文件,转换它,保存它关闭R并重复,直到我有一堆RData文件,我可以加载和绑定,但希望可能有一个更有效的方式来做到这一点,删除对数据表的所有引用后,您将返回"正常"或启动RAM使用级别.清除记忆的方法有gc()哪些?任何建议将不胜感激.

red*_*ode 7

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

  1. 在单独的R脚本中隔离需要大量内存的操作.
  2. 在新进程中运行每个脚本,执行后将其销毁.因此系统返回使用过的内存.
  3. 通过文本文件将参数传递给脚本.

考虑下面的玩具示例.

数据生成:

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

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)
Run Code Online (Sandbox Code Playgroud)

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")
}
Run Code Online (Sandbox Code Playgroud)