在不返回R中任何值的情况下运行foreach

时间:2020-02-05 08:49:29

标签: r foreach doparallel

我有一个函数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

3 个答案:

答案 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个,因此可能不会占用太多空间。

请让我知道结果。