2016-11-04 4 views
0

Was ich versuche zu tun: Öffnen Sie einen Stapel von Bildern mit EBImage, verarbeiten Sie sie und speichern Sie das verarbeitete Bild in einer neuen Datei. Ich versuche das parallel mit dem Paket "doParallel" und "foreach".Öffnen von Bilddateien in R parallel

Das Problem: Jedes Mal, wenn ich mehr als ein Prozessorkern für die Aufgabe verwenden, R gibt den Fehler:

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

Ich weiß nicht, wie mehr Informationen zu diesem Fehler zu erhalten. Wenn ich versuche, dasselbe Skript zu verwenden, aber nur einen Prozessorkern, bekomme ich kein Problem.

Beispielskript:

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)) 
} 

Der Code funktioniert, wenn nCores = 1, es funktioniert nicht, wenn nCores etwas zwischen 1 und die maximale Anzahl der Kerne zur Verfügung.

Das System, das ich diese ausgeführt werden soll ist eine virtuelle Maschine mit 36 ​​Kernen CentOS 7.

Die einzelnen Arbeiter eindeutige Dateien basierend ID auf dem Dateibild sollte zugreifen läuft, so kann ich nicht, dass es ein Problem ist mit Dateisperrung oder gleichzeitigem Lesen, außer Linux hat Probleme beim gleichzeitigen Lesen und Schreiben in dasselbe Verzeichnis.

Ich würde ehrlich glücklich sein für eine Problemumgehung sowie eine Lösung.

Vielen Dank!


Meine Sitzung Info: R Version 3.3.1 (2016.06.21) Plattform: x86_64-Apfel-darwin13.4.0 (64-Bit) unter fliessendem: 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 

Antwort

0

Darunter ein reproduzierbares Beispiel basierend auf Ihrem Originalcode. Ich konnte es sowohl auf RedHat Linux (Fedora und CentOS 6.5) als auch auf OS X Yosemite (10.10.5) erfolgreich parallel ausführen. Dies weist darauf hin, dass Ihr Problem möglicherweise system- oder konfigurationsspezifisch ist.

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)) 
}