Monkey修补R语言基础功能,以大数据功能提高速度
这一切都以我需要使用的R包 ( 'nlt' )开始,它有2个其他(相当大的)包依赖项( 'adlift' , 'ebayesthresh' )。 我需要它分析一个约4000点的数据样本。
这些算法创建了许多“隐藏”向量,因此即使乍看之下,您会认为您有足够的内存来加载数据样本并对其进行处理,但情况会变得很快。 在这一点上,我应该提到我拥有4GB内存的Ubuntu x64和Windows x64。
出于纯粹的好奇心和受虐狂,我猜想,我决定尝试一下Amazon EC2实例。 我最终尝试了其中的几个,然后我停在了具有6.5个ECU的高内存超大型实例 17.1 GB内存中,当我再次耗尽内存并且Ubuntu杀死了我的运行功能时。
我最终使用了“snowall” , “foreach”和“doSMP”的拆分应用组合方法。 我分析了我的数据,处理了每个小块并合并了结果。 感谢天使lapply和sfLapply存在。 我的笔记本电脑在7分钟内分析样品。
我想我应该很开心,但是7分钟的时间还是很多,我不想再把枪放到亚马逊EC2上去,除非真的没有其他的东西可以缩短运行时间。
我做了一些研究,R的'bigmemory'和'ff'包似乎允许相当大的加速,特别是如果我使用文件备份数据。
'nlt '包仅将向量作为输入, 'bigmemory'具有其特殊的数据类型big.matrix。 即使我能够奇迹般地将big.matrixes提供给' nlt '包,这仍然会留下许多新的向量分配,这些分配包含硬编码到包中的标准R函数以及它的依赖关系。
我一直在思考面向方面的编程/猴子修补,并且我设法找到了唯一的R软件包'r-connect' 。
现在,我看到它了,我有两个主要选项:
我在跳鲨鱼吗? 其他人可以提出另一种解决方案或分享类似的经验吗
另一种选择是分析这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
可能被切换到行/列指/和。 我不确定这会对内存使用有多大帮助,但速度会更快。 即:
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)
链接地址: http://www.djcxy.com/p/5467.html
上一篇: Monkey patching R language base functions with big data functions for speed