2015-02-13 5 views
11

Dies ist mein Code. Das Zeug in der Schleife macht Sinn.

 library(foreach) 
     library(doParallel) 
     cl <- makeCluster(7) 
     registerDoParallel(cl) 

     elasticitylist = foreach(i=1:nhousehold) %dopar% { 

      pricedraws = out$betadraw[i,12,] 
      elasticitydraws[,,i]= probarray[,,i] %*% diag(pricedraws) 
      elasticitydraws[,,i] = elasticitydraws[,,i] * as.vector(medianpricemat) 

     } 

Ich erhalte diese Fehlermeldung:

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

Ich weiß, ich habe genug Kerne (es gibt 20). Kann mir jemand helfen? Es scheint, dass die Antwort in Dokumenten nicht gefunden werden kann!

Als ich ps -ef| grep user auf meinem Unix-Server, die ich erhalten:

/apps/R.3.1.2/lib64/R/bin/exec/R --slave --no-restore -e parallel:::.slaveRSOCK() --args MASTER=localhost PORT=11025 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 
+0

Code im Wesentlichen identisch mit Ihnen abgesehen von einigen handgenerierten Daten funktioniert für mich. Wenn Sie das Beispiel reproduzierbar machen, kann ich einen anderen Blick darauf werfen. Verwenden Sie ungewöhnliche Datenstrukturen? – kasterma

+0

Die Daten sind sehr groß, aber sie sind nicht ungewöhnlich. Ich denke, $ betadraw ist eine Matrixscheibe, könnte das auch so sein? – robertevansanders

Antwort

7

Die Funktionen serialize und unserialize werden durch den Master-Prozess genannt mit den Arbeitern zu kommunizieren, wenn ein Socket-Cluster verwenden. Wenn Sie von einer dieser Funktionen einen Fehler erhalten, bedeutet dies normalerweise, dass mindestens einer der Mitarbeiter gestorben ist. Auf einem Linux-Rechner ist es möglicherweise abgestorben, weil der Rechner fast keinen Speicher mehr hatte. Der Speicherkiller entschied sich dafür, ihn zu töten, aber es gibt noch viele andere Möglichkeiten.

Ich empfehle, dass Sie die Option makeCluster outfile="" bei der Erstellung des Cluster-Objekts verwenden, so dass die Ausgabe von den Arbeitern angezeigt wird. Wenn Sie Glück haben, erhalten Sie eine Fehlermeldung von einem Mitarbeiter, bevor er stirbt, die Ihnen hilft, das Problem zu lösen.

+2

Mein Freund sagte, es ist, weil, wenn Sie versuchen, die Ausgabe zu viel Speicher haben, es Fehler in der Regel unabhängig davon, wie viel RAM Sie haben. Kennst du einen Weg um das herum? – robertevansanders

2

Ich hatte das gleiche Problem, als ich versuchte, alle 8 Kerne meiner Maschine zu verwenden. Als ich einen offen ließ, ging das Problem weg. Ich glaube, das System erfordert 1 Kern für Servicearbeiten offen gelassen, sonst erhalten Sie einen Fehler:

library(doParallel) 
#Find out how many cores are available (if you don't already know) 
cores<-detectCores() 
#Create cluster with desired number of cores, leave one open for the machine   
#core processes 
cl <- makeCluster(cores[1]-1) 
#Register cluster 
registerDoParallel(cl) 
+1

Ich glaube nicht, dass es die schiere Anzahl der Kerne ist, die den Fehler verursachen; Ich habe festgestellt, dass ich, wenn ich an großen Dateien arbeite (4 + Gb) und "doParallel" verwende, die Anzahl der verwendeten Kerne reduzieren muss, da sonst der Arbeitsspeicher knapp wird. Das Problem könnte also sein, dass zu viele Kerne zu viel Speicher verbrauchen, was den Fehler verursacht. Wer mehr Wissen hat, kann dies bestätigen/widerlegen/erklären? –

+0

Es ist wahrscheinlich, dass 'doParallel' alle Daten vom Master zu den Slaves kopiert. Somit würden die Speicheranforderungen linear in der Anzahl der Kerne skalieren. Der Master und die Slaves beziehen alle aus demselben Speicherpool, so dass es nicht schwer ist, die Speichergrenzen zu überschreiten. –