Lesen und verarbeiten von großen text-Datei von 25 GB
Ich gelesen haben, eine große text-Datei, sagen wir, 25 GB und verarbeiten müssen, die diese Datei innerhalb von 15-20 Minuten. Diese Datei wird über mehrere header-und footer-Bereich.
Versuchte ich CSplit nach split diese Datei basierend auf header, aber es nimmt etwa 24 bis 25 Minuten, um es zu teilen, um eine Reihe von Dateien basierend auf header, das ist nicht akzeptabel bei allen.
Habe ich versucht das sequentielle Lesen und schreiben durch die Verwendung BufferReader
und BufferWiter
zusammen mit FileReader
und FileWriter
. Es ist mehr als 27 min. Wieder ist es nicht akzeptabel.
Habe ich versucht einen anderen Ansatz bekommen, der start-index der einzelnen header und dann laufen mehrere threads zum Lesen der Datei von der bestimmten Stelle durch die Verwendung RandomAccessFile
. Aber kein Glück auf dieser.
Wie kann ich erreichen meine Anforderung?
Mögliche Duplikate von:
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie es mit einem großen Puffer Lesen Größe (z.B. 20 MB statt 2 MB) Ihre Daten verarbeiten, schneller. Auch nicht mit einem BufferedReader wegen der langsamen Geschwindigkeiten und Zeichen Konvertierungen.
Diese Frage wurde vorhin gefragt: Lesen Sie große Dateien in Java
Müssen Sie sicherstellen, dass das IO ist schnell genug, ohne Ihre Verarbeitung, weil ich vermute, dass die Verarbeitung, nicht die IO ist, Bremsen Sie ab. Sie sollten in der Lage, 80 MB/s von einer Festplatte und bis zu 400 MB/s von einer SSD Festplatte. Dies bedeutet, dass Sie Lesen konnte, das ganze in einer Sekunde.
Versuchen im folgenden, die ist nicht die Schnellste, aber die einfachste.
Es sei denn, Sie finden, Sie sind immer mindestens 50 MB/s haben Sie ein problem mit der hardware.
Versuchen Sie es mit
java.nio
besser zu nutzen, die Betriebssysteme Funktionalität. Vermeiden Sie das kopieren der Daten (z.B. in einen string), sondern versuchen, die Arbeit mit offsets. Ich glaube, die java.nio-Klassen werden auch Methoden zur übertragung von Daten von einem Puffer zu einem anderen, ohne ziehen der Daten in der java-Schicht an alle (zumindest auf linux), aber das wird im wesentlichen übersetzen, in Betriebssystem-Aufrufe.Für viele moderne web-Server diese Technik war der Schlüssel zu der Leistung, die Sie dienen können statische Daten mit: im wesentlichen, delegieren Sie so viel wie möglich, um das Betriebssystem zu vermeiden, Sie zu duplizieren, um den Arbeitsspeicher.
Lassen Sie mich unterstreichen dies: gerade, die durch einen 25-GB-byte-Puffer ist viel schneller als die Konvertierung in Java-Strings (die erfordern, charset encoding/decoding - und kopieren). Alles, spart Kopien und Speicher-management helfen.
Wenn das die richtige Plattform ist, möchten Sie vielleicht zu berappen, und rufen Sie eine Kombination aus cat und sed. Wenn es nicht ist, könnten Sie immer noch wollen, zu berappen und perl über die Kommandozeile. Für den Fall, dass ist unbedingt zu Java, die die eigentliche Verarbeitung, die andere haben, sofern ausreichende Antworten.
Seien Sie auf der Hut, obwohl, Beschuss aus ist nicht ohne Probleme. Aber perl oder sed sein könnte, die nur leicht erhältliche tools zum durchforsten und ändern 25GB von text in Ihrem Zeitrahmen.