这一切都是从我急需使用的R包 ('nlt')开始的,它有另外两个(相当大的)包依赖项('adlift',)。我需要它来分析大约4000点的数据样本。
这些算法创建了许多“隐藏”向量,因此,即使乍一看,您会认为您有足够的内存来加载数据样本并对其进行处理,但情况很快就变糟了。在这一点上,我应该提到我有Ubuntu和Windowsx64,我可以使用4GB的内存。
我想,出于纯粹的好奇心和受虐倾向,我决定尝试一下 EC2的例子。最后我尝试了其中的几个,我在高内存超大型实例17.1GB内存中使用了6.5个ECU,当我再次耗尽内存时,Ubuntu关闭了我的运行函数。
最后,我使用了split-apply-combine方法,使用了‘斯诺尔’,'foreach'和'doSMP'。我收集了我的数据,处理了每一个数据,并将结果组合在一起。谢天谢地,我和sfLapply存在。在我的笔记本电脑上,在7分钟内对样本进行了分析。
我想我应该很高兴,但7分钟仍然很多,我不想再一次跳槽到亚马逊EC2,除非真的没有其他东西可以缩短运行时间。
我做了一些研究,'bigmemory'和'ff'软件包的R似乎允许相当大的速度,特别是如果我使用文件支持的数据。
'nlt'包只接受向量作为输入,而'bigmemory'有其特殊的数据类型big.matrix。即使我能够神奇地将big.matrixes提供给'nlt'包,这仍然留下了许多新的向量分配和标准的R函数,这些函数都是硬编码到包和它的依赖项中。
我一直在考虑面向方面的编程/猴子修补程序( 'r-connect'. ),我设法找到了这类程序的唯一R包,‘r-connect’.。
现在,在我看来,我有两个主要选择:
making.
的噩梦。
我跳过鲨鱼了吗?其他人能提出另一种解决方案或分享类似的经验吗?
发布于 2011-03-12 20:10:23
另一种选择是分析这3个包的内存使用情况,并在不再需要时删除任何冗余数据和对象。
更新:
nlt并不太复杂;它主要封装了adlift和EbayesThresh函数,所以我想看看这两个包。
例如,adlift/R/Amatdual.R:Adual和Hdual在Amatdual函数的开头被初始化,但它们从未在函数中索引;它们在以后完全重新创建。
Adual <- matrix(0, n - steps + 1, n - steps + 1)
Hdual <- matrix(0, n - steps, n - steps + 1)
...
Hdual <- cbind(diag(length(newpoints) - 1), lastcol)
...
Adual <- rbind(Hdual, as.row(Gdual))不需要这两个初始拨款。
adlift和nlt也有几个apply的用途,可以切换到row/col表示/Sums。我不知道这对内存使用有多大的帮助,但它会更快。即:
apply(foo, 1, sum) # same as rowSums(foo)
apply(foo, 2, sum) # same as colSums(foo)
apply(foo, 1, mean) # same as rowMeans(foo)
apply(foo, 2, mean) # same as colMeans(foo)https://stackoverflow.com/questions/5284728
复制相似问题