Хранить результаты вложенного цикла foreach в классе FBM
Я работаю с большой матрицей общей памяти 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 ответ
Если я правильно понимаю, что вы хотите сделать, более быстрая альтернатива использует 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()
,