2016-04-03 18 views
0

In meiner Software immer las ich Informationen aus einem Strom X (stdout eines anderen Prozesses) mit Prozess , dann habe ich die Informationen lesen zu den anderen N-1 senden Prozesse und schließlich sammelte ich in Prozess alle Daten durch die N Prozesse ausgearbeitet.Vorschlag Distributed Computing, Daten aus einem Stream

Jetzt ist meine Frage: "Was ist der effizienteste Weg, um die Informationen aus dem Stream zwischen Prozessen zu teilen?"

PS. Prozesse können sich auch in verschiedenen Computern befinden, die über ein Netzwerk verbunden sind.

Hier habe ich einige Möglichkeiten aufzählen:

  1. Counting Linien Strom (M Linien), Speichern auf N Dateien M/N Linien und jedem Prozess 1 Datei senden.
  2. Zählen Zeilen des Streams (M Zeilen), allokieren Sie genügend Speicher, um alle Informationen zu enthalten, senden Sie an jeden Prozess direkt die Informationen.

Aber ich denke, dass diese ein Problem sein können:

  1. Schreiben so viele Dateien können ein Overhead und Senden von Dateien über ein Netzwerk sein, ist gar nicht so effizient.
  2. Ich brauche genug Speicher in Prozess , so dass Prozess kann ein Engpass sein.

Was schlagen Sie vor, haben Sie bessere Ideen? Ich verwende MPI auf C, um diese Berechnung durchzuführen.

Antwort

1

Verwenden von Dateien ist in Ordnung, wenn die Leistung kein Problem ist. Der Vorteil ist, dass Sie alles modular mit den Dateien als entkoppelte Schnittstelle behalten. Sie können sogar sehr einfache Kommandozeilen-Tools verwenden:

./YOUR_COMMAND > SPLIT_ALL 
split -n l/$(N) -d SPLIT_ALL SPLIT_FILES 

Set N in der Shell oder in geeigneter Weise ersetzen. Hinweis: In diesem Fall kann leider keine direkte Verbindung zu split hergestellt werden, da dann die Gesamtanzahl der Zeilen beim Lesen von stdin nicht ermittelt werden kann. Wenn Round-Robin, anstatt aneinander stoßenden getrennten Ordnung ist, können Sie Rohr direkt:

./YOUR_COMMAND | split -n r/$(N) -d - SPLIT_FILES 

Sie zweite Lösung ist auch in Ordnung - wenn Sie genügend Speicher haben. Denken Sie daran, geeignete kollektive Operationen, z.B. MPI_Scatter(v) zum Senden und MPI_Gather oder MPI_Reduce zum Empfangen der Daten von den Clients.

Wenn Sie nicht genügend Arbeitsspeicher haben, puffern Sie die Eingabe in Blöcken (von beispielsweise 100.000 Zeilen) und verteilen Sie die Blöcke dann an Ihre Worker, berechnen Sie, sammeln Sie das Ergebnis und wiederholen Sie.