我想做的事情: 使用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
答案 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))
}