Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
使用clusterapply的平行余弦距离_R_Matrix_Parallel Processing - Fatal编程技术网

使用clusterapply的平行余弦距离

使用clusterapply的平行余弦距离,r,matrix,parallel-processing,R,Matrix,Parallel Processing,我需要计算向量和大矩阵(>1000000行)之间的余弦距离相似性。代码如下。它工作正常,但我看不到我的8核机器的100%利用率(没有其他任何东西在它上面运行),与“cosine(vecA,matB)”的线性版本相比,整体速度提升非常低 如果不是使用8个内核将其加速8倍,那么我是否缺少一个技巧来将其加速至少5-6倍?谢谢 我已经看过其他的R并行链接,但找不到一个能解释我做错了什么的答案 库(并行) 图书馆(lsa) 我认为问题是你正在执行一百万个微小的任务,这可能是非常低效的。在这种情况下,您可

我需要计算向量和大矩阵(>1000000行)之间的余弦距离相似性。代码如下。它工作正常,但我看不到我的8核机器的100%利用率(没有其他任何东西在它上面运行),与“cosine(vecA,matB)”的线性版本相比,整体速度提升非常低

如果不是使用8个内核将其加速8倍,那么我是否缺少一个技巧来将其加速至少5-6倍?谢谢

我已经看过其他的R并行链接,但找不到一个能解释我做错了什么的答案


库(并行)
图书馆(lsa)

我认为问题是你正在执行一百万个微小的任务,这可能是非常低效的。在这种情况下,您可以使用
paraply
功能:

cosine.par <- function(cl, vecA, matB) {
  r <- parApply(cl, matB, 2, cosine, vecA)
  dim(r) <- c(length(r), 1)
  r
}
虽然这非常有效,但在使用
mclappy
对大型矩阵进行操作时,我遇到了以下错误

Error in mcfork() : 
  unable to fork, possible reason: Cannot allocate memory

如果出现此错误,您将不得不使用更少的内存,使用更少的工作人员,或者向计算机添加更多内存。

您观察到CPU使用情况如何?如果进程的计算时间不同,您可能希望尝试执行负载平衡的
clusterApplyLB
。我还发现,在一些使用英特尔CPU的机器上,有必要关闭“超线程”以实现所需的行为。我有8核Mac,运行2.4gz英特尔。Top命令显示,8个R进程中的每个进程的cpu约占25-30%,总体利用率也为30%。我原以为每个核心90%的内存占总内存的近750%,这在像这样明显的并行应用程序中是不典型的。内存呢?如果单个CPU负载仅为25%,则可能是
cosine
仅仅是内存,而不是CPU密集型。就像我说的,如果你真的需要计算能力,那么试着禁用HT。然而,需要注意的是,所有内核100%忙碌可能会导致系统无法运行,直到计算完成(没有HT)。太棒了!最后一个dim(r)@WDTWDT是什么?这是可选的,但它设置“dim”属性的方式与您的示例相同。如果不考虑它,结果将是一个向量,而不是一个只有一列的矩阵。虽然parApply工作得很好,但我观察到8个R进程中每个进程在执行期间的CPU使用率,只有两个进程达到90%的CPU级别,而另一个进程仅保持在0%。如何充分利用所有8核?@WDTWDT因为您使用的是Mac,所以使用McLappy可能会做得更好。
cosine.mc <- function(nc, vecA, matB) {
  r <- unlist(mclapply(1:nc, function(i) {
    n <- ceiling(ncol(matB) / nc)
    j <- (n * (i - 1)) + 1
    k <- min(n * i, ncol(matB))
    apply(matB[,seq(j, k), drop=FALSE], 2, cosine, vecA)
  }, mc.cores=nc))
  dim(r) <- c(length(r), 1)
  r
}
Error in mcfork() : 
  unable to fork, possible reason: Cannot allocate memory