In unserem Projekt müssen wir alle zwei Stunden eine große CSV-Datei mit einem Java-Programm erstellen.
Diese Datei enthält ca. 60.000 Zeilen (ca. 120 Zeichen pro Zeile). Über die Größe bin ich mir noch nicht sicher.
Ich würde gerne wissen, ob ich auf Speicherprobleme stoßen würde, da ich die Datei mit FileWriter öffnen und dann weiter schreiben und schließlich die Datei schließen werde.
Sollte ich mir Gedanken über die Größe der Datei machen? Wenn ja, gibt es andere gute Techniken zum Schreiben in eine große Datei in Java als die Verwendung von FileWriter?
Wir verwenden Java 5.
Antworten:
Nein, das solltest du nicht. Der Zweck einer Datei besteht darin, Dinge außerhalb des Direktzugriffsspeichers zu speichern. Die Größe des FileWriter ist konstant und unter allen Umständen ziemlich klein, selbst wenn es sich um einen gepufferten FileWriter handelt. Das ständige Umschreiben kann zu E / A-Auslastung oder CPU-Spitzen führen, aber mit ziemlicher Sicherheit nicht zu Speichermangel.
quelle
Wie Killian Foth es schrieb, sollten Sie überhaupt kein Problem haben, 60000 Zeilen sind überhaupt nicht so groß. Ich wollte Ihnen nur vorschlagen, einen der kostenlosen CSV-Parser zu verwenden, die hier im Rahmen der Initiative "Commons CSV" unter http://commons.apache.org/csv/ bereitgestellt werden, anstatt Ihre eigene Implementierung zu schreiben.
Ich habe Super CSV für einige Projekte verwendet und hatte sicherlich kein Problem damit.
quelle
Verwenden Sie FileWriter nicht. Nicht aus Leistungsgründen (Javas E / A-Klassen speichern nicht alles im Speicher, aber 60.000 Zeilen sind auch dann nichts), sondern weil Sie die Zeichencodierung nicht auswählen können. Es wird implizit die Standardcodierung der Plattform verwendet, was bedeutet, dass Text außerhalb von ASCII beschädigt werden kann.
Verwenden Sie stattdessen einen OutputStreamWriter, der einen FileOutputStream umschließt. Oder noch besser eine CSV-Bibliothek, die all diese Probleme lösen sollte.
quelle
Sie könnten die Verwendung von BufferedWriter in Betracht ziehen, obwohl dies wahrscheinlich nicht wesentlich zur Leistung beiträgt. Dies ist auf jeden Fall eine bewährte Methode, da ich mir vorstelle, dass die Anzahl der Zeilen nicht immer 60.000 beträgt.
Haben Sie darüber nachgedacht, die Datei anschließend zu komprimieren? Wenn Sie beabsichtigen, viele dieser Dateien herumliegen zu lassen, ist es möglicherweise in Ihrem Interesse, sie nach dem Schreiben zu komprimieren, insbesondere wenn Sie diese Dateien alle paar Stunden einmal erstellen.
In Bezug auf den Speicher müssen Sie sich wahrscheinlich keine Sorgen machen, es sei denn, Sie arbeiten auf einem System mit sehr wenig Speicher. In diesem Fall sollten Sie BufferedWriter verwenden und die Puffergröße explizit festlegen.
quelle