foreach和dopar不创建对象,但返回NULL

时间:2017-09-19 20:21:15

标签: r memory foreach parallel-processing doparallel

我正在使用Maxent进行一些空间分析。我有一个很长的脚本,有许多输出,我在列表中收集。它可以在rasterstack中使用for循环和低分辨率气候预测器(在我的核心i5,6gb笔记本中)。但我需要使用一组高分辨率的栅格,所有问题都来自这个问题。即使使用16核,32GB的虚拟机,处理速度也很慢,3天后,内存不存在,并且在我的循环(有92种)中大约50转之后运行关闭。我试图通过收集垃圾来清理内存和使用doParallel来改进这个脚本。在使用低分辨率预测器完全运行新脚本之后,我将使用高分辨率预测器进行尝试

因此,我将脚本更改为使用/** * Get a single column's value from the first result of a query. * * @param string $column * @return mixed */ public function value($column) 而不是foreach,并使用for

但到目前为止,我得到了这个结果:

%dopar%

我看到了关于同一问题的另一个问题,但是这个人需要的非常简单的解决方案并不适用于我..所以,非常欢迎任何提示

 [[1]]
 NULL

 [[2]]
 NULL

 [[3]]
 NULL

 [[4]]
 NULL

1 个答案:

答案 0 :(得分:3)

您可以拨打foreach来指定"收集器"变量如:

results <- foreach(i=1:4, .packages=c("dismo","scales","rgdal","rgeos","rJava")) %dopar%

然后,在foreach循环结束之前,您可以在公共列表中收集所有结果变量并返回它们:

out <- list(xm_spc_list= xm_spc_list,
            e_spc_list = e_spc_list, 
            px_spc_list = px_spc_list, 
            ...  =  ...,
            ...  =  ....)
return(out)
}

请注意,在foreach中,您可以避免使用xm_spc_list[[i]] <-之类的结构,因为foreach将通过&#34;绑定&#34;来为您解决这个问题。结果列在(有序)列表中。

检索&#34;单身&#34;在foreach之后的results列表列表中输出,然后你可以使用类似的东西:

xm_spc_list <- data.table::rbindlist(do.call(c,lapply(results, "[", 1)))
e_spc_list <- data.table::rbindlist(do.call(c,lapply(results, "[", 2)))
....
....
HTH(尽管手头的例子不可测试)