IO Performance optimieren

Schnoogle

Mitglied
Hallo,

ich habe ein Programm geschrieben, dass mehrere CSV-Dateien in einem ZipOutputStream erstellt. Dabei gehe ich folgendermaßen vor:

Erste Implementierung
  1. Viele Werte vom Datentyp double mit DecimalFormat und StringBuffer (werten wiederverwendet) formatieren.
  2. Puffern des StringBuffer in einem BufferedWriter mit append(CharSequence)
  3. Umwandeln in UTF-8 mit OutputStreamWriter
  4. Puffern in BufferedOutputStream
  5. Komprimieren in ZipOutputStream
  6. Puffern in BufferedOutputStream
  7. Schreiben in FileOutputStream
Dabei habe ich festgestellt, dass diese Implementierung bei großen Dateien nicht viel schneller ist als folgende Implementierung.

Zweite Implementieren
  1. Viele Werte vom Datentyp double mit DecimalFormat und StringBuffer (werten wiederverwendet) formatieren.
  2. Puffern des StringBuffer in einem BufferedWriter mit append(CharSequence)
  3. Umwandeln in UTF-8 mit OutputStreamWriter
  4. Puffern in BufferedOutputStream
  5. Schreiben in FileOutputStream
  6. Lesen mit FileInputStream
  7. Puffern mit BufferedInputStream
  8. Schreiben in BufferedOutputStream
  9. Komprimieren in ZipOutputStream
  10. Puffern in BufferedOutputStream
  11. Schreiben in FileOutputStream

In meiner ersten Implementierung erstelle ich die CSV-Dateien direkt in der ZIP-Datei. In der zweiten Implementierung Schreibe ich die CSV-Dateien in das Dateisystem, lese sie dann wieder ein und komprimiere sie.

Ich hatte jetzt angenommen, dass ich durch die eingesparten IO-Operationen viel Zeit spare.

Bei 8 CSV-Dateien mit jeweils knapp über 1 GB dauert es mit der ersten Implementierung 230 Sekunden und mit der zweiten Implementierung dauert es 270 Sekunden.

Ich habe den Benchmark auf einem MacBook Pro mit Windows 7 und PCI-Express FlashSpeicher ausgeführt. Könnte der Unterschied auf einem System mit einer Festplatte größer zu Gunsten der ersten Implementierung sein?

Gibt es eine Möglichkeit die Performance durch Parallelisierung zu erhöhen. Ich könnte mir vorstellen, dass es schneller gehen könnte, wenn ich zur gleichen Zeit formatieren + codieren + komprimieren und zur gleichen Zeit schreiben könnte.

Ist so etwas evtl. mit AsynchronousFileChannel in Java.nio.channels möglich?

Was ich mir auch vorstellen könnte, wäre eine Art "Double Buffering". Also ein BufferedOutputStream mit zwei Puffern A und B. In den Puffer A könnten formatierte, codierte und komprimierte Bytes geschrieben werden, während der Puffer B in die Datei geschrieben wird. Wenn der Puffer A voll ist und der Puffer B leer ist, könnte man die beiden Puffer tauschen.

Gibt es so einen Mechanismus bereits oder müsste ich das selbst implementieren?
 
Zuletzt bearbeitet:
Zurück