1

我正在 foreach 循环中使用 1.3e6x1.3e6 的大型共享内存矩阵。我使用 bigstatsr 包的 FBM 功能创建了该矩阵。我需要 FBM 类对象中的循环结果不会耗尽 RAM 内存。这就是我想要在没有 FBM 类对象的情况下做的事情。

library(doParallel)
 library(foreach)
 library("doFuture")

 cl=makeCluster(2)
 registerDoParallel(cl
                    )
 registerDoFuture()
 plan(multicore)

 results=foreach(a=1:4,.combine='cbind') %dopar% {
   a=a-1
   foreach(b=1:2,.combine='c') %dopar% {
     return(10*a + b)
   }
 } 

这就是我尝试的方式

library(bigstatsr)

 results=FBM(4,4,init=0)
 saveinFBM=function(x,j){results[,j]=x}

 foreach(a=1:4,.combine='savinFBM') %dopar% {
   a=a-1
   foreach(b=1:2,.combine='c') %dopar% {
     return(10*a + b)
   }
 } 
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'savinFBM' of mode 'function' was not found

PS:有人可以添加标签“dofuture”吗?

4

1 回答 1

0

如果我正确理解你想要做什么,一个更快的选择是使用outer(1:2, 1:4, function(b, a) 10 * (a - 1) + b).

如果你想FBM用这个函数填充一个,你可以这样做:

library(bigstatsr)
X <- FBM(200, 400)
big_apply(X, a.FUN = function(X, ind) {
  X[, ind] <- outer(rows_along(X), ind, function(b, a) 10 * (a - 1) + b)
  NULL
})

通常,当您在磁盘上写入数据时使用并行性无济于事(您在填充时执行的操作X[, ind]),但是您真的想尝试,您可以将ncores = nb_cores()其用作big_apply().

于 2018-10-05T20:06:33.433 回答