2016-11-19 4 views
2

Ich versuche, ein Problem zu lösen. Ich würde mich über Ihren wertvollen Beitrag zu diesem Thema freuen.Multiprocessing mit großer Anzahl von Dateien

Problemstellung: Ich versuche, viele Dateien (in der Größenordnung von 10 ** 6) im selben Basisverzeichnis zu lesen. Jede Datei hat den Namen nach dem Muster (YYYY-mm-tt-hh) und der Inhalt der Dateien ist wie folgt

mm1, vv1 
mm2, vv2 
mm3, vv3 
. 
. 
. 

wo mm die Minute des Tages ist und vv“ist einiger Zahlenwert in Bezug auf diese Minute. Ich muss feststellen, dass bei einer Startzeit (ex. 2010-09-22-00) und einer Endzeit (ex. 2017-09-21-23) der Durchschnitt aller vv's ist.

Also im Grunde Benutzer wird mir eine start_date und end_date, und ich werde den Durchschnitt aller Dateien zwischen dem angegebenen Datumsbereich erhalten müssen. So würde meine Funktion so etwas wie diese:

get_average(start_time, end_time, file_root_directory): 

Nun, was ich will, verstehen, wie kann ich Multiprozessing verwenden, um die kleineren Stücke mitteln, und dann auf das bauen, um die endgültigen Werte zu bekommen.

HINWEIS: Ich suche keine lineare Lösung. Bitte teilen Sie mir mit, wie ich das Problem in kleineren Brocken brechen und dann zusammenfassen kann, um den Durchschnitt zu finden. Ich habe versucht, mit multiprocessing Modul in Python durch Erstellen eines Pools von 4 Prozessen, aber ich bin nicht in der Lage, herauszufinden, wie ich die Werte im Speicher behalten und das Ergebnis für alle Stücke zusammen.

+0

Zusätzlich zu sehr breit, ist es unklar, was Sie genau wissen möchten. Das heißt, eine allgemeine (und sehr gebräuchliche) Art der Kommunikation zwischen Prozessen besteht darin, ein oder mehrere "multiprocessing.Queue" -Objekte zu verwenden. – martineau

+0

Nun, ich stimme der Aussage ist breit, und ich stimme auch realistisch, kein Dateisystem könnte 10^6 Dateien in einem einzigen Verzeichnis zu behandeln. Das heißt, mein Hauptziel hier ist, einen Prototyp zu bauen – Geek

Antwort

0

Ihr Prozess wird E/A-gebunden sein. Multiprozessing ist möglicherweise nicht sehr nützlich, wenn nicht kontraproduktiv.

Darüber hinaus ist Ihr Speichersystem, basierend auf einer enormen Anzahl von kleinen Dateien, nicht das beste. Sie sollten sich eine Zeitserien-Datenbank wie z. B. influxdb ansehen.

+0

Vereinbaren Sie den Prozess wird I/O gebunden sein, aber ich bin auf der Suche nach dem Problem mit Dateien zu lösen. Das Speichern von Daten in einer Datenbank ist für mich nicht möglich, da die Datengenerierung nicht von mir selbst gehandhabt wird. – Geek

+0

Auch wenn Sie keine Datengenerierung durchführen, können Sie sie dennoch verarbeiten, um sie einfacher abzufragen. Es hängt wirklich von Ihrem Abfrage-Muster ab: einmal oder oft, große Menge von Daten oder spärlich. – Setop

0

Angesichts der Tatsache, dass die tatsächliche Verarbeitung trivial ist — eine Summe und Anzahl von jeder Datei — mit mehreren Prozessen oder Threads wird nicht viel gewinnen. Das liegt daran, dass 90% der Mühe darin besteht, jede Datei zu öffnen und ihren Inhalt in den Speicher zu übertragen.

Die offensichtlichste Partitionierung würde jedoch auf einigen pro-Datendatei-Schema basieren. Wenn also der Suchbereich (Ihr Beispiel) bis 2017-09-21-23 ist, dann gibt es sieben Jahre mit (vielleicht?) Einer Datei pro Stunde für insgesamt 61.368 Dateien (einschließlich zwei Schalttage).

61 tausend Prozesse laufen nicht sehr effektiv auf einem System — mindestens so weit. (Wahrscheinlich wird es in einigen Jahren eine vernünftige Fähigkeit sein.) Aber für ein reales (nicht Supercomputing) System, das das Problem in einige Segmente unterteilt, vielleicht zweimal oder dreimal so viele CPUs, um die Arbeit zu erledigen. Dieser Desktop-Computer hat vier Kerne, daher würde ich zuerst 12 Prozesse ausprobieren, bei denen jeder unabhängig die Summe und die Anzahl (Anzahl der vorhandenen Samples, falls variabel) von 1/12 der Dateien berechnet.

Interprozesskommunikation kann durch Verwendung von Threads eliminiert werden. Oder für einen prozessorientierten Ansatz ist das Einrichten einer Pipe zu jedem Prozess, um die Ergebnisse zu erhalten, eine direkte Angelegenheit.

+0

Vielen Dank für Ihre Antwort. Ich verstehe 61k Prozess ist nicht das Richtige. Ich habe auch einen 4-Kern mehr Maschine, und ich versuche nur, Dinge zu skalieren, so dass sogar 4 Prozess auf einmal gut für mich ist. Könnten Sie bitte einen Beispielcode und Bibliotheken zur Verfügung stellen, um die Aufgabe zu erfüllen? Selbst wenn Sie einen Blog oder einen Online-Link teilen könnten, den Sie in der Vergangenheit verwendet haben, wäre das großartig, danke! – Geek

Verwandte Themen