我正在尝试使用doSMP / foreach来并行化R中的一些代码。
我有一个巨大的2d遗传数据矩阵 - 10,000个观察(行)和300万个变量(列)。由于内存问题,我不得不将这些数据拆分成1000个变量的块。
我想读取每个文件,执行一些统计信息,然后将这些结果写入文件。使用for循环很容易,但我想使用foreach来加速它。这就是我正在做的事情:
# load doSMP, foreach, iterators, codetools
require(doSMP)
# files i'm processing
print(filelist <- system("ls matrix1k.*.txt", T))
#initialize processes
w <- startWorkers(2)
registerDoSMP(w)
# for each file, read into memory, do some stuff, write out results.
foreach (i = 1:length(filelist)) %dopar% {
print(i)
file <- filelist[i]
print(file)
thisfile <- read.table(file,header=T)
# here i'll do stuff using that file
# here i'll write out results of the stuff I do above
}
#stop processes
stopWorkers(w)
但这会导致错误:Error in { : task 2 failed - "cannot open the connection"
。当我将%dopar%
更改为%do%
时,根本没有问题。
答案 0 :(得分:3)
在你的foreach循环中,你必须调用你要使用的包。
示例:强>
i)
foreach (i = 1:length(filelist), .packages = "rgdal") %dopar% ......
在你的情况下,你应该调用一个包矢量。
示例2:
ii)
package.vector <- c("package.1","package.2",etc)
foreach (i = 1:length(filelist), .packages = package.vector) %dopar% ......
我建议你调用你正在使用的所有包
答案 1 :(得分:1)
我认为并行输入不会加快速度。限制因素是磁盘控制器,因此当您打开2个连接并读取数据时它无济于事,因为它无论如何都必须通过磁盘控制器。磁盘IO是一个串行作业(遗憾的是),除非你有一个带有多个磁盘控制器的RAID阵列。并行IO仅适用于每台计算机都有自己的磁盘的群集。