Domanda

Saluti , Ho enorme numero di record da un database e scrivere in un file.Mi chiedevo che cosa il modo migliore per scrivere file di grandi dimensioni.(1Gb - 10Gb).

Attualmente sto usando BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
È stato utile?

Soluzione

Se proprio insistete utilizzando Java per questo, allora il modo migliore sarebbe quella di scrivere immediatamente non appena non come il dato arriva e, quindi, di raccogliere tutti i dati da ResultSet nella memoria di Java prima. Si avrebbe bisogno di almeno che gran parte della memoria libera in Java altrimenti.

Quindi, che fare per esempio.

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

Detto questo, le navi più decente di DB con funzionalità incorporate di esportazione-to-CSV che sono indubbiamente il modo più efficiente di quanto si possa fare in Java. Lei non ha menzionato quale si sta utilizzando, ma se fosse ad esempio MySQL, si potrebbe avere usato il LOAD DATA INFILE per questo. Basta consultare la documentazione specifica DB. Spero che questo dà nuove intuizioni.

Altri suggerimenti

La dimensione del buffer predefinito per un BufferedWriter è 8192.Se avete intenzione di essere iscritto squigabyte file, è possibile aumentare questo con i 2 argomento del costruttore;ad es.

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

Questo dovrebbe ridurre il numero di chiamate di sistema necessari per scrivere il file.

Ma dubito che questo renderebbe più di un paio di punti percentuali di differenza.Tirando le righe da un gruppo di risultati sarà probabilmente il principale collo di bottiglia delle prestazioni.Per significativi miglioramenti in termini di prestazioni che si avrebbe bisogno di utilizzare il database nativo di massa esportazione.

Im non sicuro al 100%, ma sembra tha BufferedReader carica i dati in un buffer nella RAM. Java può utilizzare Ram 128 MB (se non diversamente specificato), in modo che il BufferedReader sarà probabilmente la memoria di java di overflow causando un errore. Provare a utilizzare InputStreamReader e FileInputStream per leggere e poi memorizzare i dati in un char, poi basta scrivere che char utilizzando un FileOutputStream.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top