2016-07-11 17 views
1

Wenn ich versuche, einen Cluster mit stopCluster aus meinem Arbeitsbereich zu entfernen, scheint es nicht zu funktionieren. Unten ist der Code, den ich verwende.So überprüfen Sie, ob stopCluster (R) funktioniert

> cl <- makeCluster(3) 
> cl 
socket cluster with 3 nodes on host ‘localhost’ 
> stopCluster(cl) 
> cl 
socket cluster with 3 nodes on host ‘localhost’ 

Beachten Sie, dass der Befehl cl noch ein Socket-Cluster mit drei Knoten aufgerufen wird, nachdem ich es angeblich entfernt haben. Sollte ich nicht einen Fehler bekommen, dass object cl is not found? Woher weiß ich, dass mein Cluster tatsächlich entfernt wurde? Eine verwandte Frage: Wenn ich R schließe, wird der Cluster beendet und mein Computer kehrt in seinen normalen Zustand zurück, in dem er alle seine Kerne benutzen kann?

Antwort

2

Sie sollten keinen Fehler erhalten, dass cl nicht gefunden wird, bis Sie rm(cl) ausführen. Durch das Stoppen eines Clusters wird das Objekt nicht aus Ihrer Umgebung entfernt.

Verwenden showConnections zu sehen, dass keine Verbindungen aktiv sind:

> require(parallel) 
Loading required package: parallel 
> cl <- makeCluster(3) 
> cl 
socket cluster with 3 nodes on host ‘localhost’ 
> showConnections() 
    description   class  mode text  isopen can read can write 
3 "<-localhost:11129" "sockconn" "a+b" "binary" "opened" "yes" "yes"  
4 "<-localhost:11129" "sockconn" "a+b" "binary" "opened" "yes" "yes"  
5 "<-localhost:11129" "sockconn" "a+b" "binary" "opened" "yes" "yes"  
> stopCluster(cl) 
> showConnections() 
    description class mode text isopen can read can write 
> 

Unabhängig davon, ob Ihr Computer „wieder in seinen normalen Zustand“ ist abhängig von der Art des Clusters Sie erstellen. Wenn es sich nur um einen einfachen Socket- oder Fork-Cluster handelt, sollten Sie den übergeordneten Prozess ordnungsgemäß beenden, damit alle untergeordneten Prozesse beendet werden. Wenn es sich um einen komplizierteren Cluster handelt, ist es möglich, dass das Beenden von R nicht alle auf den Knoten gestarteten Jobs stoppt.

+0

Das ist ziemlich genau das, was ich gesucht habe. Ich kann den Unterschied sehen, wenn ich den Cluster stoppe. Was ich jedoch bemerke ist, dass ich zwei weitere dieser Verbindungen habe, als ich dachte. Das Erstellen und Stoppen des Clusters addiert bzw. subtrahiert drei Verbindungen, aber es gibt zwei übrig (mit Option all = FALSE). Das sind zwei mehr als du hast. Woher weiß ich, ob das ein weiterer Cluster ist, den ich stoppen sollte oder ob es etwas anderes ist? – BioBroo

+0

@BioBroo: Es ist wahrscheinlich etwas spezifisch für Ihre Einrichtung. Wenn Sie R über eine GUI oder eine IDE ausführen, können Verbindungen erstellt werden. Oder es könnte etwas in Ihrer '.Rprofile', der' .Rprofile.site' usw. sein. –

0

Leider zeigt die print.SOCKcluster Methode Ihnen nicht an, ob das Cluster-Objekt verwendbar ist. Sie können jedoch herausfinden, ob es verwendbar ist, indem Sie die Elemente des Cluster-Objekts mit der Methode print.SOCKnode drucken. Zum Beispiel:

> library(parallel) 
> cl <- makeCluster(3) 
> for (node in cl) try(print(node)) 
node of a socket cluster on host ‘localhost’ with pid 29607 
node of a socket cluster on host ‘localhost’ with pid 29615 
node of a socket cluster on host ‘localhost’ with pid 29623 
> stopCluster(cl) 
> for (node in cl) try(print(node)) 
Error in summary.connection(connection) : invalid connection 
Error in summary.connection(connection) : invalid connection 
Error in summary.connection(connection) : invalid connection 

Beachten Sie, dass print.SOCKnode tatsächlich eine Nachricht über die Socket-Verbindung, um die Prozess-ID des entsprechenden Arbeitnehmers zu erhalten sendet, wie im Quellcode gesehen:

> parallel:::print.SOCKnode 
function (x, ...) 
{ 
    sendCall(x, eval, list(quote(Sys.getpid()))) 
    pid <- recvResult(x) 
    msg <- gettextf("node of a socket cluster on host %s with pid %d", 
     sQuote(x[["host"]]), pid) 
    cat(msg, "\n", sep = "") 
    invisible(x) 
} 
<bytecode: 0x2f0efc8> 
<environment: namespace:parallel> 

Wenn also Sie haben stopCluster auf dem Cluster-Objekt aufgerufen, erhalten Sie Fehler beim Versuch, die Socket-Verbindungen zu verwenden.

+0

Das funktioniert auch. – BioBroo

Verwandte Themen