Frage

In meinem Ort, an dem ich arbeite, verwendet, um Dateien zu haben, mit mehr als Million Zeilen pro Datei. Auch wenn die Server-Speicher sind mehr als 10 GB mit 8 GB für JVM, manchmal der Server für einige Momente hängen lassen und Drosseln der anderen Aufgaben.

profilierte ich den Code und festgestellt, dass beim Lesen der Datei Speichernutzung in Giga-Bytes steigt häufig (1 GB auf 3 GB) und dann kommt plötzlich wieder normal. Es scheint, dass diese häufig hohen und niedrigen Speicher verwendet meine Server hängt. Natürlich war dies zu Garbage Collection durch.

Welche API soll ich die Dateien für eine bessere Leistung, um zu lesen?

Righ jetzt ich BufferedReader(new FileReader(...)) verwende diese CSV-Dateien zu lesen.

Prozess: Wie soll ich das Lesen der Datei

  1. Ich lese Dateien Zeile für Zeile.
  2. Jede Zeile hat nur wenige Spalten. basierend auf den Typen sie ich analysieren entsprechend (Kosten Spalte in Doppel, besuchen Spalte in int, Stichwort Spalte in String, etc ..).
  3. ich den qualifizierten Inhalt schieben (besuchen> 0) in einer HashMap und schließlich genehmigt, dass Karte am Ende der Aufgabe

Aktualisieren

Ich mache das Lesen von 30 oder 31 Dateien (eine Monatsdaten) und speichern Sie die Teilnahme an einer Karte. Später wird diese Karte einige Täter zu bekommen in verschiedenen Tabellen verwendet. Deshalb ist das Lesen muss und dass Daten zu speichern ist auch muss. Obwohl ich jetzt den HashMap Teil BerkeleyDB eingeschaltet, aber das Problem zum Zeitpunkt der Lesedatei ist gleich oder sogar noch schlimmer.

War es hilfreich?

Lösung

BufferedReader ist einer der beiden besten APIs für diesen Einsatz. Wenn Sie wirklich Probleme mit Datei gelesen haben, könnte eine Alternative sein, das Zeug zu verwenden, in

Andere Tipps

  

Ich profilierte den Code und festgestellt, dass   während die Verwendung Dateilesespeicher steigt in   Giga-Bytes häufig (1 GB auf 3 GB) und   dann kommt plötzlich wieder normal. Es   scheint, dass dies häufig hoch und niedrig   Speicher verwendet hängt meinen Server. Von   Natürlich war dies aufgrund Garbage   Sammlung.

BufferedReader(new FileReader(...)) Verwendung wird das nicht führen.

Ich vermute, dass das Problem ist, dass Sie die Zeilen / Zeilen in einem Array oder einer Liste lesen, sie verarbeiten und dann das Array / Liste zu verwerfen. Dies bewirkt, dass die Speicherauslastung zu erhöhen und dann wieder abnehmen. Wenn dies der Fall ist, können Sie die Speichernutzung reduzieren, indem jede Zeile Verarbeitung / Reihe, wie Sie es lesen.

Bearbeiten : Wir sind wir einig sind, dass das Problem über den Raum verwendet, um den Dateiinhalt im Speicher darzustellen. Eine Alternative zu einer großen Hash-Tabelle im Speicher ist auf den alten „Art verschmelzen“ Ansatz zurück gehen wir verwendet, wenn Computerspeicher in Kilobyte gemessen. (Ich gehe davon aus, dass die Verarbeitung von einem Schritt dominiert wird, in dem Sie eine Lookup mit Schlüsseln K tun, um die zugehörigen Reihe R zu erhalten.)

  1. Bei Bedarf Vorprozess jeder der Eingabedateien, so dass sie auf dem Schlüssel K sortiert werden.

  2. Verwenden Sie einen effizienten Datei Sortier-Dienstprogramm alle Eingangsdateien in Reihenfolge auf der K. Sie sortieren mögen ein Dienstprogramm verwenden, die einen klassischen Mergesort-Algorithmus verwendet werden. Dieser Wille aufgeteilt, jede Datei in kleinere Stücke, die im Speicher sortiert werden können, um die Stücke sortieren, schreiben sie in temporäre Dateien, dann verschmelzen die sortierten temporären Dateien. Die UNIX / Linux sort Dienstprogramm ist eine gute Option.

  3. die sortierten Dateien parallel lesen, alle Zeilen zu lesen, die von allen Dateien auf jeden Schlüsselwert beziehen, deren Verarbeitung und dann zum nächsten Schlüsselwert Treten auf.

Eigentlich bin ich ein bisschen überrascht, dass BerkeleyDB mit nicht helfen. Wenn jedoch Profilierung sagt Ihnen, dass die meiste Zeit in den Aufbau der DB würde, können Sie in der Lage sein, es zu beschleunigen, indem die Eingabedatei Sortierung (wie oben!) In der Reihenfolge der Schlüssel aufsteigend, bevor Sie den DB bauen. (Wenn Sie einen großen dateibasierten Index erstellen, erhalten Sie eine bessere Leistung, wenn die Einträge in der Reihenfolge der Schlüssel hinzugefügt werden.)

Versuchen Sie die folgenden vm Optionen zur Abstimmung mit der gc (und einige gc Druck tun):

-verbose:gc -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
scroll top