我有一个函数doSomething(),该函数在foreach循环中运行,因此将一些计算结果保存为.csv文件。因此,我不需要foreach的返回值,实际上,我不需要返回值,因为它会使我的内存混乱到无法运行所需迭代次数的程度。
如何强制foreach没有返回值,或删除迭代的返回值?
这是一个说明我的问题的最小示例:
cl <- parallel::makePSOCKcluster(1)
doParallel::registerDoParallel(cl)
"%dopar%" <- foreach::"%dopar%"
doSomething <- function () {
a <- as.numeric(1L)
}
foreach::foreach (i = 1:4) %dopar% {
doSomething()
}
输出为:
[[1]]
[1] 1
[[2]]
[1] 1
[[3]]
[1] 1
[[4]]
[1] 1
答案 0 :(得分:4)
根据我的经验,R中的并行计算可以为每个群集节点分配内存。
这意味着,如果您有一个大数据集,每个节点都需要计算,那么该数据将被多次分配。这导致高RAM消耗。由于要在每个循环中写入输出并在之后丢弃结果,因此可以尝试使用rm
函数并在每个函数调用中调用垃圾回收(例如,使用gc
)。
如上所述,它为E L M工作。 Thx进行测试!
答案 1 :(得分:1)
来自?foreach
:
foreach和%do%/%dopar%运算符提供了一个循环结构 可以将其视为loop和lapply标准的混合体 功能。它看起来类似于for循环,并且评估 表达式,而不是函数(如lapply中),但其目的是 返回一个值(默认情况下为列表),而不是导致 副作用。
行
但是它的目的是返回一个值(默认情况下为列表)
说这是foreach的预期行为。不确定您要如何继续...
答案 2 :(得分:0)
如dario所述; foreach
返回一个列表。因此,您要做的是改为使用for
循环。您可以在循环内使用write.csv
函数将每次迭代的结果写入csv文件中。
对于并行计算,请尝试使用parSapply
包中的parallel
函数:
library(parallel)
cl <- parallel::makePSOCKcluster(1)
doParallel::registerDoParallel(cl)
parSapply(cl, 1:4, function(doSomething) a <- as.numeric(1L))
编辑;
将此与Freakozoid的建议相结合(将rm函数的参数设置为a
)
library(parallel)
cl <- parallel::makePSOCKcluster(1)
doParallel::registerDoParallel(cl)
parSapply(cl, 1:4, function(doSomething) {a <- as.numeric(1L); write.csv(a, "output.csv"); rm()})
将为您提供作为csv文件的结果输出,以及NA
的列表。由于该列表仅包含NA
个,因此可能不会占用太多空间。
请让我知道结果。