2016-07-12 15 views
0

Ich versuche, eine parallele Foreach-Schleife mit DoMC zu bauen, aber es gibt einige seltsame Verhaltensweisen. Der Code wie folgt aussiehtR foreach, die für Schleifen seltsames Verhalten enthält

for (file in files) { 
do stuff 
for (extra in extras) { 
do some heavy stuff 
} 
} 
  • Wenn ich die domc oder DoParallel laden, beginnt die Schleife ein Kern verwendet wird, aber in der zweiten Schleife nutzt es alle 4 Kerne
  • Wenn I schalten die zum Schleifen% bis foreach Do% bekomme ich das exakt gleiche Verhalten.
  • Wenn ich foreach für die äußere Schleife verwende und die innere als eine for-Schleife lasse, wird das Skript langsam. Es beginnt mit 4 Jobs parallel und dann stoppen sie alle und die CPU-Auslastung nimmt ab.

Was ich will ist die obere Schleife und nicht die innere Sekunde parallelisieren. Weiß jemand was los ist? Ich habe foreach und dOMC in der Vergangenheit benutzt und hatte dieses Problem nie zuvor.

Antwort

1

Es sieht aus wie Sie ein paar Dinge passiert, aber es ist hier nicht genug sicher sein:

Wenn Sie dies aus RStudio verwenden es nicht gut funktionieren kann, das ist ein erklärtes Begrenzung der domc. Versuchen Sie, es direkt aus dem R 64 Bit zu starten.

Sie müssen require(doMC) oder library(doMC) Anruf das Paket, aber Sie müssen auch sie mit dem Gerät zu registrieren oder es wird nicht richtig

registerDoMC(4) 

Arbeit, die 4 ist es, wie viele Kerne zu sagen laufen. Wenn du nichts sagst, versucht es 1/2 deines Kerns zu benutzen.

Und Sie haben keine vollständigen Code über das entsprechende Format ist:

foreach(file in files) %dopar% { stuff to do }

Sie ausdrücklich sagen, es muss eine parallele Verarbeitung mit dem %dopar% Befehl zu tun. Wenn Sie alle Kerne in einem Bereich und nicht in anderen Bereichen verwenden möchten, müssen Sie Optionen festlegen, die angeben, wie viele Kerne für die einzelnen Teile von Ihnen funktionieren oder codieren. Wenn Sie aber sagen, dass die äußere Schleife 4 und eine innere Schleife 2 verwenden soll, ist es möglicherweise langsamer als in der äußeren Schleife auf 4 eingestellt zu sein und die Dinge selbst zu verwalten. Ich bin nicht 100% klar, wie es Übergaben bewerkstelligt, Experiment zu sehen.

Um die Anzahl der Kerne zu ändern, fügen Sie einfach die folgende Zeile:

options(cores=2)

Ich hoffe, das hilft!

+0

Die Antwort ist gut, danke. Ich habe herausgefunden, dass das Problem anders ist, deshalb muss ich eine neue Frage dafür stellen. – Michael

+0

Wenn Sie auf einem sehr großen Datensatz mit vielen internen Berechnungen und Transformationen schreiben, werden Sie wahrscheinlich zu einem schnellen Speicherschwellen kommen, indem Sie die Rate erhöhen, mit der die CPU arbeitet. Versuchen Sie es mit 'rm()' und 'gc()' um Zwischendaten von INNEN JEDER SCHLEIFE zu löschen, nachdem sie an ein Array, einen Rahmen oder eine Datei im permanenten Speicher angehängt wurden, um zu sehen, ob dies den Speicher freigibt und es mit Ihrem neuen Multicore-Programm Schritt halten kann. – sconfluentus