Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance R包nlt/adlift/ebayesthresh使用大量内存;如何提高绩效?_Performance_Optimization_R_Memory_Parallel Processing - Fatal编程技术网

Performance R包nlt/adlift/ebayesthresh使用大量内存;如何提高绩效?

Performance R包nlt/adlift/ebayesthresh使用大量内存;如何提高绩效?,performance,optimization,r,memory,parallel-processing,Performance,Optimization,R,Memory,Parallel Processing,这一切都是从一个我急需使用的R包开始的('nlt'),它还有两个(相当大的)包依赖项('adlift','ebayesthresh')。我需要它来分析大约4000个点的数据样本 这些算法创建了许多“隐藏”向量,因此,即使乍一看你认为你有足够的内存来加载数据样本并对其进行处理,但事情很快就会变坏。在这一点上,我应该提到我的Ubuntu x64和Windows x64都有4GB的RAM供我使用 我想纯粹是出于好奇和受虐狂,我决定在一个亚马逊EC2实例上尝试一下。最后,我尝试了其中的几个,并在高内存超

这一切都是从一个我急需使用的R包开始的('nlt'),它还有两个(相当大的)包依赖项('adlift''ebayesthresh')。我需要它来分析大约4000个点的数据样本

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

我想纯粹是出于好奇和受虐狂,我决定在一个亚马逊EC2实例上尝试一下。最后,我尝试了其中的几个,并在高内存超大实例17.1 GB内存和6.5个ECU处停了下来,当我再次耗尽内存时,Ubuntu终止了我的运行功能

最后,我使用了分割-应用-组合方法'snowall''foreach''doSMP'。我核对了我的数据,处理了每一次核对,并合并了结果。谢天谢地,lappy和sflappy是存在的。样本在我的笔记本电脑上分析了不到7分钟

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

我做了一些研究,R的'bigmemory''ff'包似乎允许相当大的速度提升,特别是如果我使用文件备份数据

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

我一直在想面向方面的编程/猴子补丁,我设法找到了唯一一个用于这种事情的R包,'R-connect'

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

  • 手动重写nlt包及其其他2个包中的所有函数依赖项,使用'bigmemory'函数,而不是标准的R list()、matrix()等,这是一场噩梦
  • 'bigmemory'函数替换标准R列表、矩阵等

我在跳鲨鱼吗?其他人可以提出其他解决方案或分享类似的经验吗?

另一种选择是分析这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))

@雅克:软件!=语言,并且3个贡献的包不代表R。我经常使用base R在32位Windows上使用3GB RAM操作数千万个数据点,因此4000个点很难被称为“大数据”。你可以用任何对内存有不切实际要求的语言编写软件。“你可以用任何对内存有不切实际要求的语言编写软件”,用R语言就更容易了@约书亚·乌尔里希:我希望你明白那些包裹不是我写的。我真的不明白你有必要告诉我你是如何用标准的R函数定期操作数百万个数据点的,而你甚至都懒得看一下“nlt”包算法有多复杂。我的“几乎算不上大数据”4000点最终被扩展成一个更大的数据集。该软件包包括自适应小波提升技术、遗传算法类型的算法和繁重的数学知识。R社区面临的一个大问题是无法认识到R的弱点。它需要的是一个强大的声音批评者群体。哦,一些引用类型变量也会有帮助@jakker:我知道你没有编写这些包,但你有它们的源代码。@jakker:确保在rm()之后运行gc(),以释放内存。是的,我想我会尽可能深入地重新编写。我只是再次确认,它是如此缓慢,因为内存分配的方式。我进一步减小了split-apply联合收割机的数据块大小,几乎将运行时间减少了一半。该死的这个该死的R!!再次感谢你的建议@雅克:这里的问题是那些对数学有着深刻理解而对计算机科学有着浅薄理解的人编写的代码——在计算科学中,无论是哪种语言,这种情况都会发生。@Joshua Ulrich:软件包中的一个函数最终存储了所有迭代中的全部先前矩阵;最后,它得到了一个矩阵列表,其中包含:4097x4097矩阵,4096x4096矩阵,依此类推,直到开始。难怪演出很糟糕。替换应用程序可以进一步提高性能。@Joshua Ulrich:他已经得到通知,我希望他也很高兴它不再耗尽内存。正如我所能发现的,这是继承的代码,不是他从头开始写的,所以这是可以理解的。祝你在那里度过愉快的一天!
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)