Frage

Grüße, Ich bekomme große Anzahl von Datensätzen aus der Datenbank und schreiben in eine file.I frage mich, was der beste Weg, um große Dateien zu schreiben. (1 GB - 10 Gb).

Zur Zeit ich BufferedWriter bin mit

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
War es hilfreich?

Lösung

Wenn Sie darauf bestehen, mit Hilfe von Java für diesen wirklich, dann der beste Weg wäre, zu schreiben sofort , sobald die Daten in kommen und somit nicht zu sammeln alle , um die Daten von ResultSet in dem ersten Java-Speicher. Sie würden zumindest brauchen so viel freier Speicherplatz in Java anders.

So tun z.

while (resultSet.next()) {
    writer.write(resultSet.getString("columnname"));
    // ...
}

Wie gesagt, die meisten anständigen DB Schiffe mit eingebauten Export-to-CSV-Funktionen, die Art und Weise Ohne Zweifel sind effizienter als Sie jemals in Java tun könnte. Sie erwähnen nicht, welche Sie verwenden, aber wenn es zum Beispiel MySQL war, können Sie die LOAD DATA INFILE für diese. Nur verweist die DB-spezifische Dokumentation. Hoffe, das gibt neue Einblicke.

Andere Tipps

Die Standardpuffergröße für eine BufferedWriter ist 8192. Wenn Sie squigabyte Dateien gehen zu schreiben, könnten Sie wollen dies das 2 Argument Konstruktor zu erhöhen; z.

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

Dies sollte die Anzahl der syscalls benötigt reduziert die Datei zu schreiben.

Aber ich bezweifle, dass dies mehr als ein paar Prozent Unterschied machen würde. Zeilen aus der Ergebnismenge gezogen wird wahrscheinlich die wichtigste Performance-Engpass sein. Für signifikante Verbesserungen in der Leistung müssen Sie die Datenbank der nativen Massenexportmöglichkeiten nutzen.

Im nicht 100% sicher, aber es scheint tha BufferedReader die Daten in einen Puffer in dem RAM lädt. Java kann 128mb Ram (wenn nicht anders angegeben), so dass die BufferedReader wird wahrscheinlich Überlauf java Speicher einen Fehler verursacht verwenden. Versuchen Sie es mit Input und Fileinputstream zu lesen und dann die Daten in einem char, dann schreiben Sie einfach, dass char ein Outputstream verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top