当输入的尺寸增加1时,R中的并行处理将无限期停止

问题描述

我具有以下功能

l2norm_squared = function(X) Re(sum(Conj(t(X)) %*% X))

fast_mmd = function(X,Y,nBasis = 2^6,seed = NULL) {
  
  if (!is.null(seed)) set.seed(seed)
  d = ncol(X)
  if (ncol(Y) != d) stop('# of columns of X and Y should match.')
  
  n = nrow(X)
  m = nrow(Y)
  N = nBasis
  Z = matrix(rnorm(N*d),nrow=N) 
  ZXt = Z %*% t(as.matrix(X))
  ZYt = Z %*% t(as.matrix(Y))
  phi = function(sigma) rowMeans( exp(1i*ZXt/sigma) / sqrt(N))
  psi = function(sigma) rowMeans( exp(1i*ZYt/sigma) / sqrt(N))
  l2norm_squared( phi(1) - psi(1) )
}

我正在尝试并行运行它。例如,我这样设置数据:

d = 42
X = matrix(rnorm(100*d),nrow=100)
Y = X[50:60,]
ncores = 4
nBasis = 2^6

然后运行以下命令:

seed = 1
all_indices = 1:ncol(X)  
system.time( out <- parallel::mclapply(combn(all_indices,2,simplify = F),function(ind) {
                       ind =  setdiff(all_indices,ind)
                       fast_mmd(X[,ind],Y[,nBasis,seed)
                    },mc.cores = ncores) )["elapsed"]

或以下内容

doParallel::registerDoParallel(ncores)
p = ncol(X)
C = combn(1:p,simplify = F)
nC = length(C)
library(foreach)  
foreach(i=1:nC,.combine = "c") %dopar% {
    ind = setdiff(1:p,C[[i]])
    fast_mmd(X[,seed)
}

在这种情况下,mclapplyforeach都运行良好,并且都在不到一秒钟的时间内返回。但是,当我将d = 42更改为d = 43时,两个循环都无限期挂起,因此我必须终止该过程。对于其他输入,或者在您的情况下,它可能是不同的阈值,但是d上似乎存在阈值(在这种情况下,从42变为43)会导致此行为。知道是什么原因造成的,以及如何解决

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)