6

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

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

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

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

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

4

1 回答 1

7

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

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

考虑下面的玩具示例。

数据生成:

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")
}
于 2013-01-25T00:33:38.927 回答