并行打开R中的图像文件

时间:2016-11-04 17:57:09

标签: r parallel-processing doparallel

我想做的事情: 使用EBImage打开一堆图像,处理它们,并将处理后的图像保存在新文件中。我正在尝试使用包#34; doParallel"和" foreach"。

问题: 每次我为任务使用多个处理器核心时,R都会返回错误:

Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

我不知道如何获得有关此错误的更多信息。如果我尝试使用相同的脚本但只有一个处理器核心,我就不会遇到任何问题。

示例脚本:

library(EBImage)
library(foreach)
library(doParallel)

nCores = 1
registerDoParallel(makeCluster(nCores))

img_stack_ids = c("A", "B", "C", "D")
foreach(i = 1:384, .packages = c("EBImage")) %dopar% {
  imgs = tryCatch(readImage(sprintf("/INPUT_IMGS/%s_%s, i, img_stack_ids)), 
                  error = function(e) array(0, dim = c(0,0,0)))

  img_processed = processingFunction(img_list)
  writeImage(img_processed, sprintf("/OUTPUT_IMGS/%s", i))
}

当nCores = 1时代码有效,当nCores介于1和最大可用内核数之间时,代码不起作用。

我希望它运行的系统是一台运行CentOS 7的36核的虚拟机。

各个工作人员应该根据文件ID访问唯一文件,这样我就无法确定文件锁定或同时阅读的问题,除非linux有同时读写问题的问题。同样的目录。

老实说,我很乐意为解决方案和解决方案而努力。

谢谢!

我的会话信息:     R版本3.3.1(2016-06-21)     平台:x86_64-apple-darwin13.4.0(64位)     运行于:OS X 10.11.6(El Capitan)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods
    base     

other attached packages:
[1] doParallel_1.0.10  iterators_1.0.8    foreach_1.4.3
    ZProjection_0.99.0 EBImage_4.16.0    

loaded via a namespace (and not attached):
 [1] locfit_1.5-9.1      lattice_0.20-34     codetools_0.2-15
     png_0.1-7           fftwtools_0.9-7     tiff_0.1-5
     grid_3.3.1          tools_3.3.1         jpeg_0.1-8
     abind_1.4-5        
[11] rsconnect_0.5       BiocGenerics_0.20.0

1 个答案:

答案 0 :(得分:0)

基于原始代码的可重现示例。我能够在RedHat Linux(Fedora和CentOS 6.5)和OS X Yosemite(10.10.5)上并行成功运行它。这表明您的问题可能是系统或配置特定的。

library(EBImage)
library(foreach)
library(doParallel)

nCores = detectCores()
registerDoParallel(makeCluster(nCores))

input_dir = "input_imgs"
output_dir = "output_imgs"

dir.create(input_dir)
dir.create(output_dir)

no_images = 384
img_stack_ids = LETTERS[1:4]

## create sample images
n = 8 # image dimensions

for (i in 1:no_images)
  for (id in img_stack_ids)
    writeImage(Image(runif(n^2), c(n, n)),
               sprintf("%s/%s_%s.png", input_dir, i, id))

## do the actual work
foreach(i = 1:no_images, .packages = c("EBImage")) %dopar% {
  imgs = tryCatch(
    readImage(sprintf("%s/%s_%s.png", input_dir, i, img_stack_ids)), 
    error = function(e) array(0, dim = c(0,0,0))
  )

  ## do the processing

  writeImage(imgs, sprintf("output_imgs/%s.tif", i))
}