• R语言
  • 求助:如何基于大数据量高效的做相关性检验

我现在又两个50-70M的数据,分别为a(485512行,36列),b(45行,36列),我想提取A中的每一行与B中的每一行做相关性检验,提取P值以及相应统计量(代码如下),但是我现在遇到一个问题就是程序运行太慢,而且只能在8G,64位的机器上运行,换成4G,32位的机器就会报错,无法分配矢量。我试过ff包,还是很慢,因为我用的是最低效的for循环,不知道我的程序上能不能有什么改进。

<br />
PValue_Spearman<-matrix(NA,nrow=485512,ncol=45)<br />
Statistics_Spearman<-matrix(NA,nrow=485512,ncol=45)</p>
<p>for (i in 1:485512){<br />
  for (j in 1:45){<br />
    Cor_Spearman<-cor.test(a[i,],b[j,],meth='spearman',exact=FALSE)<br />
    Statistics_Spearman[i,j]<-round(Cor_Spearman$estimate,digits=3)<br />
    PValue_Spearman11[i,j]<-round(Cor_Spearman$p.value,digits=3)<br />
  }<br />
}<br />
</p>

http://r.789695.n4.nabble.com/Very-slow-using-double-apply-and-cor-test-to-compute-correlation-p-values-for-2-matrices-td871312.html

除了向量化, 提取精简 spearman 部分的代码, 还可以做个简单并行. 单机多核, 横向切开数据多机并行都可以. 毕竟要做的次数比较多, 而向量化怎么做也只能跑满一个核.

ff 主要是解决内存问题, 在这里没什么帮助.

回复 第2楼 的 肖楠:恩恩~十分感谢啊~我看了~学到很多东西~不过我还想问问,单机多核要怎么做啊,,对机器要求高吗?[s:11]

当然核数是越多越好, 最低两个核也可以了. 实现都不难, 就是在某个现成框架下稍微改写一下原有代码就行了. 简单方便的方案像 foreach + doMC 或者 multicore, 复杂一些的有 snow. 具体可以看下各个包中自带的 vignettes 以及 O'Reilly 去年的一本书 Parallel R.