Ersatz für Parallel-Plyr mit DoMC

9

Betrachten Sie eine standardmäßige gruppierte Operation in einem data.frame:

%Vor%

Es ist trivial, ein Multi-Core-Setup zu nutzen, indem Sie stattdessen einfach .parallel = TRUE schreiben. Dies ist eine meiner Lieblingsfunktionen von plyr.

Aber da plyr veraltet ist (ich denke) und im Wesentlichen durch dplyr, purrr usw. ersetzt wurde, ist die Lösung für die parallele Verarbeitung wesentlich ausführlicher geworden:

%Vor%

Sie können sich vorstellen, wie lange dieses Beispiel dauern könnte, da jedes Paket und jedes Objekt, das Sie innerhalb der Schleife benötigen, seinen eigenen Befehl cluster_* benötigt, um es auf die Knoten zu kopieren. Die nicht-parallele Plr-zu-Dplyr-Übersetzung ist nur eine einfache dplyr::group_by -Konstruktion, und es ist bedauerlich, dass es keine knappe Möglichkeit gibt, parallele Verarbeitung zu ermöglichen. Also, meine Fragen sind:

  • Ist das der bevorzugte Weg, um meinen Code von plyr nach dplyr zu übersetzen?
  • Welche Art von Magie passiert hinter den Kulissen von plyr, was es so einfach macht, die Parallelverarbeitung zu aktivieren? Gibt es einen Grund, warum diese Fähigkeit besonders schwer zu dplyr hinzuzufügen wäre und deshalb existiert sie noch nicht?
  • Unterscheiden sich meine beiden Beispiele grundlegend darin, wie der Code ausgeführt wird?
Devin 01.12.2017, 16:42
quelle

1 Antwort

3
  1. Ich glaube nicht, dass es einen wirklich "bevorzugten" Weg gibt, {plr} -Code in {dplyr} zu übersetzen.

  2. In den Kommentaren hat @ Aurèle eine bessere Arbeit geleistet als je zuvor, als ich die Verbindung zwischen {plyr} und {doMC} beschrieben habe. Eine Sache, die passiert ist, dass sich die Anreize etwas geändert haben. {doMC} stammt von Revolution Analytics (seit Kauf von Microsoft). Aber Hadley, der dplyr entwickelt hat, arbeitet derzeit bei RStudio. Diese beiden Unternehmen konkurrieren im IDE-Bereich. Es ist also naheliegend, dass ihre Pakete nicht gut aufeinander abgestimmt sind. Die einzige Form der Parallelität, die ich aus RStudio stark unterstützt habe, ist {sparklyr}, die sie relativ einfach eingerichtet haben. Aber ich kann nicht wirklich empfehlen, mit Spark zu feilschen, um Parallelverarbeitung für eine einzelne Maschine zu machen.

  3. @ Aurèle hat es wieder gut verstanden, die Ausführungsunterschiede zu erklären. Ihr neuer Code verwendet einen PSOCK-Cluster und den alten Code, der für forks verwendet wird. Gabeln verwenden eine Kopie im Schreibmodus für den Zugriff auf den Arbeitsspeicher, sodass parallele Prozesse mit dem Zugriff auf die gleichen Daten unmittelbar nach dem Verzweigungsprozess beginnen können. PSOCK-Cluster erzeugen neue Kopien von R - sie müssen Bibliotheken laden und eine explizite Kopie der Daten erhalten.

Sie können ein Muster wie ... verwenden

%Vor%

... mit etwas Finesse am map_df Schritt, um eine Parallelverarbeitung zu machen. Beachten Sie, dass unter {purrr} die ~ eine anonyme Funktionssyntax ist, wobei .x für die Werte steht, die zugeordnet wurden.

Wenn Sie gefährlich leben möchten, können Sie möglicherweise eine Version von etwas Ähnlichem erstellen, ohne {future} zu verwenden, indem Sie eine private Methode in {purrr} verwenden

%Vor%     
russellpierce 16.12.2017, 13:31
quelle

Tags und Links