Wir müssen lesen und verschiedene Arten von Nachrichten/run Statistiken auf einer 10 GB-Textdatei, beispiels einem FIX Motor log zu zählen. Wir verwenden Linux, 32-Bit, 4 CPUs, Intel, in Perl codieren aber die Sprache spielt keine Rolle. Ich habe einige interessante Tipps in Tim Brays WideFinder project gefunden. Wir haben jedoch herausgefunden, dass die Verwendung der Speicherzuordnung von Natur aus durch die 32-Bit-Architektur begrenzt ist.Was ist der schnellste Weg, 10-GB-Dateien von der Festplatte zu lesen?
Wir haben versucht, mehrere Prozesse, die schneller zu arbeiten scheint, wenn wir die Datei parallel verarbeiten mit 4 Prozesse auf 4 CPUs. Hinzufügen von Multi-Threading verlangsamt es, vielleicht wegen der Kosten der Kontextwechsel. Wir haben versucht, die Größe des Thread-Pool zu ändern, aber das ist immer noch langsamer als einfache Multi-Prozess-Version. Der Speicherzuordnungsteil ist nicht sehr stabil, manchmal dauert es 80 Sekunden und manchmal 7 Sekunden auf einer 2 GB Datei, vielleicht von Seitenfehlern oder etwas in Bezug auf virtuellen Speicherverbrauch. Wie auch immer, kann Mmap über 4 GB auf einer 32-Bit-Architektur nicht maßstäblich.
Wir haben versucht, Perl IPC::Mmap und Sys::Mmap. Sieht in Map-Reduce als gut, aber das Problem ist wirklich I/O gebunden, die Verarbeitung selbst ausreichend schnell ist.
Also haben wir beschlossen, das grundlegende I/O durch Abstimmen Puffergröße, um zu versuchen zu optimieren, Typ usw.
Kann jemand, der von einem bestehenden Projekt bewusst ist, wo dieses Problem effizient in jeder Sprache/Plattform gelöst wurde Zeigen Sie auf einen nützlichen Link oder schlagen Sie eine Richtung vor?
Was ist die rohe Leistung auf einer einzigen CPU für 2G? Sie müssen wahrscheinlich feststellen, ob die E/A das Problem oder die CPU-Berechnungen ist. – Cervo
Wenn Sie wirklich an die Festplatte (IO) gebunden sind, sollten Sie wahrscheinlich schnellere Festplatten, mehr Festplatten (in RAID0, RAID5, RAID10 usw.) oder eine 64-Bit-Maschine mit genügend Speicher zum Speichern der Datei kaufen eine RAM-Disk. Jeder vernünftige einzelne Datenträger sollte in der Lage sein, 50 MB/s zu ziehen; mehrere schnelle Festplatten sollten in der Lage sein, Sie auf mindestens 300 MB/s zu schieben. – derobert
Ich würde empfehlen, nicht Sys :: Mmap, sondern File-Map (aus Gründen, die in der Dokumentation des letzteren angegeben sind) zu verwenden. In jedem Fall möchten Sie wahrscheinlich nicht IPC :: Mmap verwenden. –