我正在使用R来处理一些数据,这些数据不是很大但足以导致可用内存出现问题。 (我使用的是带有3Gb Ram的32位系统,不可能使用其他系统。)
我发现包data.table应该是进行内存有效计算的好方法。特别是这篇关于连接表而不复制的帖子似乎有帮助: data.table join then add columns to existing data.frame without re-copy
在进行一些测试时我发现,即使使用引用表,大小也在快速增长:
#rm(list=ls()); gc();
library(data.table);
n <- 7000000;
A <- data.table(a=1:n, z="sometext", key="a");
B <- data.table(a=1:n, b=rnorm(n, 1), key="a");
#ACopy<-A[B, .(b=i.b, c=i.b, d=i.b, e=i.b, f=i.b, g=i.b, h=i.b, j=i.b, k=i.b, l=i.b, m=i.b)];
A[B, ':='(b=i.b, c=i.b, d=i.b, e=i.b, f=i.b, g=i.b, h=i.b, j=i.b, k=i.b, l=i.b, m=i.b)]
object.size(A);
在上面的例子中增加n时,我得到一个“如果大小不能分配向量...”错误。我很惊讶这个错误开始出现在桌面大小约600Mb。 (我知道不是所有的3Gb都可以使用,但1.5Gb应该是可行的。)任何人都可以解释为什么错误出现在600Mb的站点上了吗? (工作区清除,没有其他(内存昂贵的)应用程序正在运行)。
ACopy不使用data.tables参考功能。在这里,对象限制为~600Mb对我来说似乎是合理的,因为这里进行了一些复制。令我感到惊讶的是a)ACopy小于A和b)参考解决方案导致如此大的对象(我预计它会因参考而小得多)。你可以看到我是新手,如果有人能解释的话会很高兴。
谢谢, 迈克尔