2015-02-13 16 views
11

Questo è il mio codice. La roba all'interno del loop ha senso.

 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) 

     } 

Continuo a ricevere questo errore:

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

So di avere abbastanza core (ce ne sono 20). Qualcuno può aiutare con questo? Sembra che la risposta non si trovi da nessuna parte nei documenti!

Quando eseguo ps -ef| grep user sul mio server Unix, ottengo:

/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

Codice essenzialmente identico al tuo tranne per alcuni dati generati a mano per me. Se riproducete l'esempio riproducibile, posso dare un'altra occhiata. Stai usando strutture dati insolite? – kasterma

+0

I dati sono molto grandi, ma non sono insoliti. Penso che $ betadraw sia una fetta di matrice, potrebbe essere? – robertevansanders

risposta

7

Le funzioni serialize e unserialize sono chiamati dal processo di master per comunicare con i lavoratori quando si utilizza un cluster presa. Se si verifica un errore da una di queste funzioni, in genere significa che almeno uno dei lavoratori è morto. Su una macchina Linux, potrebbe essere morto perché la macchina era quasi senza memoria, quindi il killer fuori dalla memoria ha deciso di ucciderlo, ma ci sono molte altre possibilità.

Suggerisco di utilizzare l'opzione makeCluster outfile="" quando si crea l'oggetto cluster in modo che venga visualizzato l'output dai lavoratori. Se sei fortunato, riceverai un messaggio di errore da un lavoratore prima che muoia, che ti aiuterà a risolvere il problema.

+2

Il mio amico ha detto che è perché quando si tenta di avere l'uscita di memoria troppo alta, tipicamente non regge la quantità di RAM che si ha. Conosci un modo per aggirare questo? – robertevansanders

2

Ho avuto lo stesso problema, quando ho provato a utilizzare tutti gli 8 core della mia macchina. Quando ne ho lasciato uno aperto, il problema è andato via. Credo che il sistema richieda 1 core per le attività di servizio lasciate aperte, altrimenti si verificherà un errore:

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

Non penso che sia l'unico numero di core che causa l'errore; Ho notato che, quando lavoro su file di grandi dimensioni (4 + Gb) e uso "doParallel", ho bisogno di ridurre il numero di core utilizzati, altrimenti ho problemi di memoria. Quindi il problema potrebbe essere che troppi core usano troppa memoria che genera l'errore. Chiunque abbia più conoscenze può confermare/confutare/spiegare questo? –

+0

è probabile che 'doParallel' copia tutti i dati dal master agli slave. quindi, le richieste di memoria si ridurranno linearmente nel numero di core. il master e gli slave attingono tutti dallo stesso pool di memoria, quindi non è difficile violare i limiti di memoria. –

Problemi correlati