【发布时间】:2013-04-29 08:18:42
【问题描述】:
我有一个非常大的字符串向量,想使用foreach 和dosnow 包进行并行计算。我注意到foreach 会为每个进程复制向量,从而快速耗尽系统内存。我试图将向量分解为列表对象中的较小部分,但仍然没有看到任何内存使用减少。有人对此有想法吗?下面是一些演示代码:
library(foreach)
library(doSNOW)
library(snow)
x<-rep('some string', 200000000)
# split x into smaller pieces in a list object
splits<-getsplits(x, mode='bysize', size=1000000)
tt<-vector('list', length(splits$start))
for (i in 1:length(tt)) tt[[i]]<-x[splits$start[i]: splits$end[i]]
ret<-foreach(i = 1:length(splits$start), .export=c('somefun'), .combine=c) %dopar% somefun(tt[[i]])
【问题讨论】:
-
只是一个想法:调用
ret<-foreach( k in tt, .export=c('somefun'), .combine=c) %dopar% somefun(k)时,您是否看到内存消耗下降? -
感谢 Beasterfield 的提示,但
foreach似乎无法识别in语法。 -
对不起,我的意思当然是
foreach( k = tt, ... )。 -
有效!我还尝试了
iterators包,iter用于列表对象和isplit用于矢量对象避免将大矢量复制到每个进程中。
标签: r parallel-processing mpi