私がやろうとしていること: 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