Große Datenmengen effizient in CSV File speichern

Ethernut

Mitglied
Hallo Forumsmitglieder,

ich hänge gerade an einem Problem beim speichern von großen Daten. Auf stackoverflow.com habe ich das hier gefunden:

http://stackoverflow.com/questions/1062113/fastest-way-to-write-huge-data-in-text-file-java

sowas ähnliches brauche ich auch. Ich muss kwasi aus einer Liste mit ungefär der gleichen Größe wie die erstellte und durchaus auch noch größer. Was ist der effizienteste Weg, so schnell wie möglich solche großen Datenmengen zu speichern? Auf meinem Rechner geht es recht schnell, aber wenn dieses Program auf einem etwas langsamenren Rechner laufen soll (und das soll es auch), dann funktioniert das nicht etwas langsamer.

Gibt es eine bessere Variante als die im stackoverflow thread? Wenn ja, wäre ich für jede Hilfe sehr dankbar.

glg Ethernut
 
Ich muss kwasi aus einer Liste mit ungefär der gleichen Größe wie die erstellte und durchaus auch noch größer.

Diesen Satz bitte in einer verständlichen Variante nochmal 😉

Was ist der effizienteste Weg, so schnell wie möglich solche großen Datenmengen zu speichern? Auf meinem Rechner geht es recht schnell, aber wenn dieses Program auf einem etwas langsamenren Rechner laufen soll (und das soll es auch), dann funktioniert das nicht etwas langsamer.

Die beste Variante ist es mehrere Zeilen zu Buffern und dann immer wieder den Buffer in die Datei zu schreiben (wurde im StackOverflow Thread auch behandelt).
Dadurch verringert sich die Anzahl der Zugriffe auf die Festplatte.

EDIT: Je nachdem wie deine genaue Anforderung ist ->
Hast du deine Liste schon vollständig im Speicher oder liest du diese Liste von einem File oder einer Datenbank ein, verarbeitest die Daten etwas und schreibst die Liste dann wieder in ein neues File raus?
Threads könnten hier ebenfalls etwas Performance bringen, ein Thread liest die Daten, mehrere verarbeiten die Daten, ein weiterer schreibt die Daten gebuffered in ein File.
 
Hallo Joose,

vielen lieben Dank für Deine schnelle Antwort 😉

Diesen Satz bitte in einer verständlichen Variante nochmal 😉
Im Thread wurde eine Liste herangezogen. Zum Testen für die Idee reicht die eigentlich aus. Der Code soll aber dynamisch sein. Also auch für (deutlich) größere Listen/Arrays eingesetzt werden können.

Die beste Variante ist es mehrere Zeilen zu Buffern und dann immer wieder den Buffer in die Datei zu schreiben (wurde im StackOverflow Thread auch behandelt).
Dadurch verringert sich die Anzahl der Zugriffe auf die Festplatte.
Ok, probiere ich gleich aus. Wenn das die schnellste ist, geht eh nicht mehr 😉

EDIT: Je nachdem wie deine genaue Anforderung ist ->
Hast du deine Liste schon vollständig im Speicher oder liest du diese Liste von einem File oder einer Datenbank ein, verarbeitest die Daten etwas und schreibst die Liste dann wieder in ein neues File raus?
Threads könnten hier ebenfalls etwas Performance bringen, ein Thread liest die Daten, mehrere verarbeiten die Daten, ein weiterer schreibt die Daten gebuffered in ein File.
Um die Geschwindigkeit zu testen erstelle ich ein Array wie im Thread beschrieben. Aber tatsächlich wir der Methode ein berechnetes Array übergeben, dass es möglichste effizient speichern soll.
 
Ok, probiere ich gleich aus. Wenn das die schnellste ist, geht eh nicht mehr 😉

PS: meinst Du dieses writeBuffered(records,8192); ??

Buffered Streams verwenden 🙂
BufferedWriter zum Beispiel

Um die Geschwindigkeit zu testen erstelle ich ein Array wie im Thread beschrieben. Aber tatsächlich wir der Methode ein berechnetes Array übergeben, dass es möglichste effizient speichern soll.

Ok, sprich es wird schon das fix fertige Array übergeben und es muss nur noch ins File geschrieben werden. Da lässt sich nichts mehr optimieren außer eben Buffered Streams zu verwenden.

Eine andere Überlegung wäre eben (wie oben schon angesprochen) der Umbau auf einen Multithreaded Workflow um ein paralleles lesen, verarbeiten und schreiben zu ermöglichen. Aber keine Ahnung ob der Aufwand den Nutzen lohnt.
 

Zurück
Oben