2016-11-04 3 views
0

私がやろうとしていること: EBImageを使用してイメージのスタックを開き、それらを処理して、新しいファイルに保存します。私はこれを、パッケージ "doParallel"と "foreach"を使って並列に試みています。イメージファイルをRで並列に開く

問題:私はこのエラーのいずれかのより多くの情報を取得する方法がわからない

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

: 私は仕事のために複数のプロセッサコアを使用して任意の時間は、Rは、エラーを返します。同じスクリプトを使用しようとしたが、プロセッサコアが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が、そうでないときのコードが動作します。

私はこれが上で実行するシステムは、ファイルIDに基づいて、個々の労働者が独自のファイルにアクセスするべきであるCentOSの7

を実行している36コアを搭載した仮想マシンはので、私はそれが問題の画像だことはできませんされていることlinuxに同じディレクトリへの読み込みと書き込みを同時に行うことができない限り、ファイルのロックや同時読み込みがありません。

私は正直言って解決策と解決策に満足しています。

ありがとうございました!


私のセッション情報: Rバージョン3.3.1(2016年6月21日) プラットフォーム:x86_64版 - リンゴ - darwin13.4.0(64ビット) の下で実行:OS X 10.11.6(エルキャピタン)

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

元のコードに基づいて再現可能な例を以下に示します。私は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)) 
} 
関連する問題