在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()
更好?任何建议都将不胜感激。
答案 0 :(得分:7)
在我的项目中,我不得不处理许多大文件。我按照以下原则组织了例程:
R
脚本中隔离需要大量内存的操作。考虑下面的玩具示例。
数据生成:
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")
}