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'

现在,我看到它了,我有两个主要选项:

  • 手动重写nlt包及其所有函数依赖关系,而不是使用标准的R list(),matrix()等等,使用'bigmemory'函数,这是一个噩梦。
  • 'bigmemory'函数替换标准R列表,矩阵等
  • 我在跳鲨鱼吗? 其他人可以提出另一种解决方案或分享类似的经验吗


    另一种选择是分析这3个包的内存使用情况,并删除任何冗余数据,并在不再需要时删除对象。

    更新:
    nlt是不是太复杂; 它大多包装adliftEbayesThresh函数,所以我会看看这两个包。

    以adlift / R / Amatdual.R为例: AdualHdualAmatdual函数的开头初始化,但它们从未在函数中编入索引; 他们以后会完全重新创建。

    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))
    

    不需要这两个初始分配。

    adliftnlt也有几种用途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

    下一篇: CSS: Hiding cursor without any external files