Ich gehe davon aus, dass Ihre Frage aus der Beobachtung stammt, dass die E / A einen erheblichen Overhead in Ihrer gesamten Analyse verursacht. In diesem Fall können Sie versuchen, die E / A mit der Berechnung zu überlappen.
Ein erfolgreicher Ansatz hängt davon ab, wie Sie auf die Daten zugreifen und welche Berechnungen Sie für diese Daten durchführen. Wenn Sie ein Muster identifizieren können oder der Zugriff auf verschiedene Bereiche der Daten im Voraus bekannt ist, können Sie versuchen, die "nächsten Datenblöcke" im Hintergrund vorab abzurufen, während Sie die "aktuellen Datenblöcke" verarbeiten.
Wenn Sie beispielsweise Ihre Datei nur einmal durchlaufen und jede Zeile oder jeden Zeilensatz verarbeiten, können Sie den Stream in Zeilenblöcke (oder MB) aufteilen. Dann können Sie bei jeder Iteration über die Chunks Chunk i + 1 laden, während Sie Chunk i verarbeiten.
Ihre Situation ist möglicherweise komplexer und erfordert komplexere Lösungen. In jedem Fall besteht die Idee darin, die E / A im Hintergrund auszuführen, während der Prozessor über Daten verfügt, an denen gearbeitet werden kann. Wenn Sie weitere Details zu Ihrem spezifischen Problem angeben, können wir uns möglicherweise eingehender damit befassen;)
---- Erweiterte Version nach Angabe weiterer Details ----
Ich bin mir nicht sicher, ob ich die Notation verstehe, aber wie Sie sagten, ist die Idee eine All-in-All-Interaktion. Sie erwähnen auch, dass die Daten möglicherweise in den Arbeitsspeicher passen. Dann würde ich damit beginnen, die Zeit zum Laden aller Daten und die Zeit zum Durchführen der Berechnung zu messen. Jetzt,
Wenn der Prozentsatz der E / A niedrig ist (niedrig, da Sie sich nicht um den Overhead kümmern, unabhängig davon, was er ist: 0,5%, 2%, 5%, ...), verwenden Sie einfach den einfachen Ansatz: Daten laden sofort und berechnen. Sie sparen Zeit für weitere interessante Aspekte Ihrer Forschung.
Wenn Sie sich den Aufwand nicht leisten können, sollten Sie sich überlegen, was Pedro vorgeschlagen hat. Denken Sie daran, was Aron Ahmadia erwähnt hat, und testen Sie es, bevor Sie eine vollständige Implementierung durchführen.
Wenn die vorherigen nicht zufriedenstellend sind, würde ich mich für eine Out-of-Core- Implementierung entscheiden [1]. Da es so aussieht, als würden Sie Berechnungen mit Daten durchführen, gibt es Hoffnung :) Einige Pseudocodes (vorausgesetzt, die Ergebnisse Ihrer Analyse passen in den Arbeitsspeicher):n2n
Laden Sie chunk1 und chunk2
für Chunks ist i = 1 bis n
Laden Sie den Block i + 1 asynchron
für Chunks in j = i + 1 bis n
Laden Sie den Block j + 1 asynchron
Rechne mit den Chunks i, j (* für die erste Iteration sind dies die vorinstallierten Chunks 1 und 2 *)
Hinweis: Dies ist ein schneller und unsauberer Pseudocode. Man müsste die Indizes anpassen.
Um dies zu implementieren, ist es üblich, die sogenannte Doppelpufferung zu verwenden . Grob gesagt: Teilen Sie das Gedächtnis in zwei Arbeitsbereiche; Während Daten im Hintergrund in Arbeitsbereich 1 geladen werden, berechnet der Prozessor mit den Daten in Arbeitsbereich 2. Tauschen Sie bei jeder Iteration die Rolle aus.
Es tut mir leid, dass ich momentan keine gute Referenz finden kann.
[1] Ein Out-of-Core-Algorithmus enthält einen Mechanismus zum (effizienten) Behandeln von Daten, die sich auf der Festplatte befinden. Sie werden im Gegensatz zu In-Core ("In-RAM") als Out-of-Core bezeichnet.
mmap
in Ihren Hauptcode implementieren . Viele moderne Betriebssysteme bieten eine ähnliche Leistungread
bei weniger Komplikationen. (Außerdem bietet mmap in Python eine portable Schnittstelle zu den Windows- und UNIX-Speicherzuordnungen.)Vielleicht können Sie Cython in Ihren Datei-E / A-Abschnitten verwenden und dieses Teil in C-Code konvertieren?
quelle