performance - R 包 nlt/adlift/ebayesthresh 使用大量内存;如何提高性能?

标签 performance optimization r memory parallel-processing

这一切都始于一个 R 包,我需要糟糕地使用 ('nlt'),它有 2 个其他(相当大的)包依赖项(' adlift''ebayesthresh')。我需要它来分析大约 4000 个点的数据样本。

算法创建了许多“隐藏”向量,因此即使乍一看您认为自己有足够的内存来加载数据样本并对其进行处理,但事情很快就变糟了。在这一点上,我应该提到我可以使用 Ubuntu x64 和 Windows x64 以及 4GB 的 RAM。

我猜是出于纯粹的好奇心和受虐狂,我决定在 Amazon EC2 实例上试一试。我最终尝试了其中的几个,然后停在了 High-Memory Extra Large Instance 17.1 GB 内存和 6.5 个 ECU 上,当我再次耗尽内存并且 Ubuntu 终止了我的运行功能。

我最终使用了 'snowall''foreach''doSMP' 的 split-apply-combine 方法。我对数据进行了分 block ,处理了每个 block 并合并了结果。感谢天堂 lapply 和 sfLapply 的存在。在我的笔记本电脑上不到 7 分钟就对 sample 进行了分析。

我想我应该很高兴,但 7 分钟仍然很长,我不想再次跳到 Amazon EC2 上,除非真的没有其他东西可以缩短运行时间。

我做了一些研究,R 的 'bigmemory''ff' 包似乎可以显着提高速度,尤其是在我使用文件备份数据的情况下。 p>

'nlt' 包只接受向量作为输入,例如 'bigmemory' 有它的特殊数据类型 big.matrix。即使我能够神奇地将 big.matrixes 提供给 'nlt' 包,这仍然会留下许多带有标准 R 函数的新向量分配,这些函数被硬编码到包中并且它的依赖项.

我一直在思考面向方面的编程/猴子补丁,我设法找到了显然唯一的 R 包,'r-connect'

现在,在我看来,我有两个主要选择:

  • 从其他 2 个包中手动重写 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 的几种用途,可以切换到 row/col Means/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)

关于performance - R 包 nlt/adlift/ebayesthresh 使用大量内存;如何提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5284728/

相关文章:

arrays - 数组中的条件和

MySQL InnoDB 插入很慢

php - 在 PHP 中迭代日期时的效率

c++ - 当 95% 的情况下的值是 0 或 1 时,对非常大的数组进行随机访问的任何优化?

python - 适用于 OS X/Python/R 的 CHAID 分析选项

javascript - 什么时候不应该使用事件委托(delegate)?

assembly - 对代码进行“手动优化”意味着什么?

optimization - 使用梯度和(稀疏)Hessian 的无约束优化

R按列中的数字对数据进行分组

r - 如何在 ggplot2 中使用用户定义颜色的六边形分箱来绘制点