将嵌套 foreach 循环的结果存储在 FBM class
store results from a nested foreach loop in a FBM class
我在 foreach 循环中使用 1.3e6x1.3e6 的大共享内存矩阵。我用 bigstatsr 包的 FBM 函数创建了那个矩阵。
我需要 FBM class 对象中的循环结果不会 运行 超出 RAM 内存。
这就是我想在没有 FBM class 对象的情况下做的事情。
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" 吗?
如果我理解正确你想做什么,一个更快的替代方法是使用 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()
.
的附加参数
我在 foreach 循环中使用 1.3e6x1.3e6 的大共享内存矩阵。我用 bigstatsr 包的 FBM 函数创建了那个矩阵。 我需要 FBM class 对象中的循环结果不会 运行 超出 RAM 内存。 这就是我想在没有 FBM class 对象的情况下做的事情。
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" 吗?
如果我理解正确你想做什么,一个更快的替代方法是使用 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()
.