2017-08-19 5 views
3

Ich versuche, etwas auf einem sehr großen Dataset auszuführen. Grundsätzlich möchte ich alle Dateien in einem Ordner durchlaufen und die Funktion vonJSON darauf ausführen. Ich möchte jedoch Dateien überspringen, die einen Fehler erzeugen. Ich habe eine Funktion mit tryCatch gebaut, das funktioniert jedoch nur, wenn ich die Funktion lappy und nicht parLapply verwenden.TryCatch mit parLapply (paralleles Paket) in R

Hier ist mein Code für meine Exception-Handling-Funktion:

readJson <- function (file) { 
require(jsonlite) 
dat <- tryCatch(
     { 
     fromJSON(file, flatten=TRUE)  
     }, 
     error = function(cond) { 
       message(cond) 
       return(NA) 
     }, 
     warning = function(cond) { 
        message(cond) 
        return(NULL) 
        } 
    ) 
    return(dat) 
} 

und dann rufe ich parLapply auf ein Zeichen Vektor Dateien, die die vollständigen Pfade zu den JSON-Dateien enthält:

dat<- parLapply(cl,files,readJson) 

Dies erzeugt einen Fehler, wenn eine Datei erreicht wird, die nicht ordnungsgemäß beendet wird, und erstellt die Liste "dat" nicht, indem die problematische Datei übersprungen wird. Was sollte die readJson-Funktion mildern?

Wenn ich reguläres Plätschern verwende, funktioniert es jedoch einwandfrei. Es erzeugt die Fehler, jedoch erstellt es immer noch die Liste, indem es die fehlerhafte Datei überspringt.

irgendwelche Ideen, wie ich die Ausnahmebehandlung mit parLappy parallel verwenden könnte, so dass es über die problematischen Dateien überspringen und die Liste generieren wird?

Antwort

2

In Ihrer error Handler-Funktion cond ist ein Fehlerzustand. message(cond) signalisiert diesen Zustand, der an den Arbeitern aufgefangen und als Fehler an den Master übertragen wird. Entweder entfernen Sie die message Anrufe oder ersetzen Sie sie mit etwas wie message(conditionMessage(cond)) Sie werden nichts auf dem Master obwohl sehen, so Entfernen ist wahrscheinlich am besten.

+0

Dies hat den Trick! Ich danke dir sehr!!! – user2905393

0

Was Sie tun können, ist so etwas wie dies (mit einem anderen Beispiel reproduzierbar):

test1 <- function(i) { 
    dat <- NA 
    try({ 
    if (runif(1) < 0.8) { 
     dat <- rnorm(i) 
    } else { 
     stop("Error!") 
    } 
    }) 
    return(dat) 
} 
cl <- parallel::makeCluster(3) 
dat <- parallel::parLapply(cl, 1:100, test1) 

Sehen Sie diese related question für andere Lösungen. Ich denke, mit foreach mit .errorhandling = "pass" wäre eine andere gute Lösung.