2016-11-04 4 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은 오류를 반환합니다. 동일한 스크립트를 사용하지만 하나의 프로세서 코어 만 사용하려고해도 아무런 문제가 없습니다.

샘플 스크립트 :

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는 개별 근로자 파일 ID를 기반으로 고유 한 파일에 액세스되어야한다 7.

실행 36 개 코어 가상 머신이다 리눅스가 같은 디렉토리에 동시에 읽고 쓰는 문제가 없다면, 파일 잠금 또는 동시 읽기가 필요합니다.

저는 솔직히 해결 방법과 솔루션에 만족합니다.

감사합니다.


내 세션 정보 : 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)) 
}