0

私がやろうとしていること: EBImage を使用して画像のスタックを開き、それらを処理し、処理された画像を新しいファイルに保存します。パッケージ「doParallel」と「foreach」を使用して、これを並行して試みています。

問題: タスクに複数のプロセッサ コアを使用するたびに、R は次のエラーを返します。

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

このエラーに関する詳細情報を取得する方法がわかりません。同じスクリプトを使用しようとしても、プロセッサ コアが 1 つしかない場合、問題は発生しません。

サンプル スクリプト:

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
4

1 に答える 1

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))
}
于 2016-11-11T15:42:46.040 に答える