不能在foreach循环(doSMP)中使用read.table()

时间:2011-03-23 01:46:51

标签: r foreach parallel-processing

我正在尝试使用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%时,根本没有问题。

2 个答案:

答案 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仅适用于每台计算机都有自己的磁盘的群集。