Wir müssen verschiedene Arten von Nachrichten lesen und zählen / ausführen einige Statistiken über eine 10 GB große Textdatei, z.B. eine FIX Motor Protokoll. Wir verwenden Linux, 32-Bit, 4 CPUs, Intel, programmieren in Perl, aber aber die Sprache ist nicht wirklich wichtig.
Ich habe einige interessante Tipps im Buch von Tim Bray gefunden WideFinder-Projekt . Wir haben jedoch festgestellt, dass die Verwendung von Memory Mapping von Natur aus durch die 32-Bit-Architektur begrenzt ist.
Wir haben versucht, mehrere Prozesse zu verwenden, was zu funktionieren scheint schneller, wenn wir die Datei parallel mit 4 Prozessen auf auf 4 CPUs. Das Hinzufügen von Multi-Threading verlangsamt es, vielleicht wegen der Kosten für die Kontextumschaltung. Wir haben versucht, die Größe des Threadpools zu ändern, aber das ist immer noch langsamer als einfache Multiprozess-Version.
Der Teil der Speicherzuordnung ist nicht sehr stabil, manchmal ist er dauert 80 Sekunden und manchmal 7 Sekunden bei einer 2 GB großen Datei, vielleicht wegen Seitenfehlern oder etwas, das mit der Nutzung des virtuellen Speichers zusammenhängt. Wie auch immer, Mmap kann nicht über 4 GB auf einem 32-Bit-System skalieren. Architektur.
Wir haben Perl's IPC::Mmap y Sys::Mmap . Nachgeschaut auch mit Map-Reduce beschäftigt, aber das Problem ist wirklich I/O gebunden, die Verarbeitung selbst ist ausreichend schnell.
Daher haben wir uns entschlossen, die grundlegende E/A zu optimieren, indem wir die Puffergröße, Typ usw. zu optimieren.
Kennt jemand ein bestehendes Projekt, bei dem diese Problem in irgendeiner Sprache/Plattform effizient gelöst wurde auf einen nützlichen Link hinweisen oder eine Richtung vorschlagen?