хранить результаты из вложенного цикла foreach в классе FBM - PullRequest
0 голосов
/ 05 октября 2018

Я работаю с большой матрицей разделяемой памяти 1.3e6x1.3e6 в цикле foreach.Я создаю эту матрицу с помощью функции FBM пакета bigstatsr.Мне нужны результаты цикла в объекте класса FBM, чтобы не исчерпать оперативную память.Это то, что я хочу сделать без объекта класса 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»?

1 Ответ

0 голосов
/ 05 октября 2018

Если я правильно понимаю, что вы хотите сделать, более быстрая альтернатива использует 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...