it-swarm.com.de

Fehler beim Aufruf der serialize R-Funktion

Ich lade folgende Pakete in R:

library(foreach)
library(doParallel)
library(iterators)

Ich "synchronisiere" Code lange Zeit, aber in letzter Zeit bekomme ich INTERMITTENT-Stopps, während Code ausgeführt wird. Der Fehler ist:

Error in serialize(data, node$con) : error writing to connection

Meine fundierte Vermutung ist, dass die Verbindung, die ich mit den folgenden Befehlen eröffne, möglicherweise abgelaufen ist:

## Register Cluster
##
cores<-8
cl <- makeCluster(cores)
registerDoParallel(cl)

Auf der makeCluster-Manpage sehe ich, dass die Verbindungen standardmäßig erst nach 30 Tagen ablaufen! Ich konnte Optionen einstellen (Fehler = Wiederherstellen), um zu überprüfen, ob die Verbindung geöffnet ist oder nicht, wenn der Code angehalten wird. Ich habe mich jedoch entschlossen, diese allgemeine Frage vorher zu posten.

WICHTIG:

1) Der Fehler ist wirklich zeitweilig, manchmal führe ich denselben Code erneut aus und erhalte keine Fehler. 2) Ich führe alles auf demselben Multi-Core-Computer (Intel/8-Cores) aus. Es ist also kein Kommunikations- (Netzwerk-) Problem zwischen den Clustern. 3) Ich bin ein starker Benutzer der CPU- und GPU-Parallelisierung auf meinem Laptop und meinem Desktop (64 Kerne). Leider ist es das erste Mal, dass ich es bin Ich bekomme diese Art von Fehler.

Hat jemand den gleichen Fehler?

Wie gewünscht, gebe ich meine sessionInfo () an:

> sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] TTR_0.22-0       xts_0.9-3        doParallel_1.0.1 iterators_1.0.6  foreach_1.4.0    Zoo_1.7-9        Revobase_6.2.0   RevoMods_6.2.0  

loaded via a namespace (and not attached):
[1] codetools_0.2-8 compiler_2.15.3 grid_2.15.3     lattice_0.20-13 tools_2.15.3   

@SeteveWeston, unter dem Fehler in einem der Anrufe (wieder intermittierend):

starting worker pid=8808 on localhost:10187 at 15:21:52.232
starting worker pid=5492 on localhost:10187 at 15:21:53.624
starting worker pid=8804 on localhost:10187 at 15:21:54.997
starting worker pid=8540 on localhost:10187 at 15:21:56.360
starting worker pid=6308 on localhost:10187 at 15:21:57.721
starting worker pid=8164 on localhost:10187 at 15:21:59.137
starting worker pid=8064 on localhost:10187 at 15:22:00.491
starting worker pid=8528 on localhost:10187 at 15:22:01.855
Error in unserialize(node$con) : 
  ReadItem: unknown type 0, perhaps written by later version of R
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

Hinzufügen etwas mehr Informationen. Ich setze Optionen (Fehler = Wiederherstellen) und gab die folgenden Informationen an:

Error in serialize(data, node$con) : error writing to connection

Enter a frame number, or 0 to exit   

1: #51: parallelize(FUN = "ensemble.prism", arg = list(prism = iis.long, instances = oos.instances), vectorize.arg = c("prism", "instances"), cores = cores, .export 
2: parallelize.R#58: foreach.bind(idx = i) %dopar% pFUN(idx)
3: e$fun(obj, substitute(ex), parent.frame(), e$data)
4: clusterCall(cl, workerInit, c.expr, exportenv, obj$packages)
5: sendCall(cl[[i]], fun, list(...))
6: postNode(con, "EXEC", list(fun = fun, args = args, return = return, tag = tag))
7: sendData(con, list(type = type, data = value, tag = tag))
8: sendData.SOCKnode(con, list(type = type, data = value, tag = tag))
9: serialize(data, node$con)

Selection: 9

Ich habe versucht zu prüfen, ob die Verbindungen noch verfügbar sind, und es gibt:

Browse[1]> showConnections()
   description                class      mode  text     isopen   can read can write
3  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
4  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
5  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
6  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
7  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
8  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
9  "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
10 "<-www.007guard.com:10187" "sockconn" "a+b" "binary" "opened" "yes"    "yes"    
Browse[1]> 

Da die Verbindungen offen sind und der Fehler 0 die Version R bedeutet (wie von @SteveWeston ausgeführt), kann ich wirklich nicht herausfinden, was hier passiert.

EDIT 1:

MEINE Abhilfe für das Problem

Der Code ist gut in Bezug auf Argumente, die an die Funktion übergeben werden. Daher hat die Antwort von @MichaelFilosi nicht viel auf den Tisch gebracht. Vielen Dank für Ihre Antwort! 

Ich konnte nicht genau herausfinden, was mit dem Anruf falsch war, aber zumindest konnte ich das Problem umgehen.

Der Trick bestand darin, die Argumente des Funktionsaufrufs für jeden parallelen Thread in kleinere Blöcke aufzuteilen.

Magisch verschwand der Fehler.

Lassen Sie mich wissen, ob das Gleiche für Sie funktioniert hat!

26
MSardelich

Dies ist höchstwahrscheinlich darauf zurückzuführen, dass nicht genügend Speicherplatz zur Verfügung steht (Einzelheiten finden Sie in meinem Blogbeitrag ). Hier ist ein Beispiel, wie Sie diesen Fehler verursachen können:

> a <- matrix(1, ncol=10^4*2.1, nrow=10^4)
> cl <- makeCluster(8, type = "FORK")
> parSapply(cl, 1:8, function(x) {
+   b <- a + 1
+   mean(b)
+   })
Error in unserialize(node$con) : error reading from connection
10
Max Gordon

Ich hatte lange Zeit mit diesem Problem zu kämpfen und konnte es beheben, indem ich alle benötigten Pakete mit .packages=c("ex1","ex2") in die Argumente innerhalb der foreach-Schleife schob. Zuvor hatte ich nur require("ex1") in der Schleife verwendet, und dies scheint die Hauptursache für meine Fehler gewesen zu sein. 

Insgesamt würde ich nur sicherstellen, dass Sie alles Mögliche in die foreach-Argumente einbinden, um diese Art von Fehlern zu vermeiden. 

2
Johnathan A

Ich habe einen ähnlichen Fehler erhalten Fehler in unserialize (Knoten $ con): Fehler beim Lesen von Verbindung

Ich fand heraus, dass es ein fehlendes Argument in einem Aufruf einer C-Funktion durch .Call() War. Vielleicht kann es hilfreich sein!

2
Michele Filosi

Ich hatte den gleichen Fehler bei der Verwendung von foreach mit einem doSNOW Backend.

Ich habe den gleichen Fehler wie bei der Operation nach dem Timeout erhalten, aber wenn die Task ohne Verwendung von foreach ausgeführt wird, wird kein Fehler zurückgegeben.

Anscheinend kann der Task-Manager Prozesse aus einer Vielzahl von Gründen abbrechen, nicht nur aus Speichermangel.

In meinem speziellen Fall schien das Problem die Kerntemperatur zu sein. Wenn Sie die Anzahl der CPU-Kerne verringern und einen sys.sleep() -Aufruf ausführen, wird das System kühler und der Fehler wird nicht mehr angezeigt.

Es kann einen Versuch wert sein.

1
Elijah

Ich habe das gleiche Problem und bezweifle, dass es sich um ein Gedächtnisproblem handelt. Mein Code ist so einfach wie:

library(doParallel)
library(foreach)
cl <- makeCluster(2, outfile='LOG.TXT')
registerDoParallel(cl)
res <- foreach(x=1:10) %dopar% x

und ich habe die folgende Fehlermeldung in LOG.TXT erhalten:

starting worker pid=13384 on localhost:11776 at 18:25:29.873
starting worker pid=21668 on localhost:11776 at 18:25:30.266
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Error in unserialize(node$con) : error reading from connection
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -> unserialize
Execution halted

Das Programm funktioniert trotzdem, deshalb habe ich es einfach ignoriert. Ich fühle mich jedoch immer unwohl, diese Fehler in der Protokolldatei zu sehen.

1
Yue Zhao

In Shiny habe ich diesen Fehler verursacht, indem ich in ein ActiveValues-Objekt innerhalb des Parallelcodes geschrieben habe 

0
PeterVermont