2010-01-07 19 views
6

Saludos, Obtengo gran cantidad de registros de la base de datos y escribo en un archivo. Me preguntaba cuál sería la mejor manera de escribir archivos de gran tamaño. (1Gb - 10Gb).java: ¿escribir archivos grandes?

Actualmente estoy usando BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV)); 
while(done){ 
//do writings 
} 
mbrWriter.close(); 
+1

Parece razonable para mí (aparte de recoger un conjunto de caracteres al azar y cerrar la secuencia subyacente en un bloque finally). Probablemente el problema de rendimiento se reducirá a la velocidad con la que el disco puede escribir datos (y probablemente querrá que se vuelva a leer). –

+1

(O concurrencia en esa base de datos. Establecer el nivel de aislamiento para la conexión. Tal vez establecer el tamaño de búsqueda). –

Respuesta

9

Si realmente insisten en Java para esto, entonces la mejor manera sería escribir inmediatamente tan pronto como los datos viene en y por lo tanto no recoger todo los datos de ResultSet en la memoria de Java primero. Necesitaría al menos esa cantidad de memoria libre en Java de lo contrario.

Por lo tanto, p. Ej.

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

Dicho esto, los barcos de DB más dignos con capacidades incorporadas a la exportación a CSV que son undoubtely manera más eficiente de lo que jamás podría hacer en Java. No mencionaste cuál estás usando, pero si fuera por ejemplo MySQL, podrías haber usado el LOAD DATA INFILE para esto. Solo remita la documentación específica de DB. Espero que esto te brinde nuevas ideas.

4

El tamaño de búfer predeterminado para un BufferedWriter es 8192. Si va a escribir archivos squigabyte, puede aumentar esto utilizando el constructor de 2 argumentos; p.ej.

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

Esto debería reducir el número de llamadas de sistema necesarias para escribir el archivo.

Pero dudo que esto haga una diferencia de más de un par de por ciento. La extracción de filas del resultado probablemente sea el cuello de botella de rendimiento principal. Para mejoras significativas en el rendimiento, necesitaría usar las instalaciones de exportación masiva nativa de la base de datos.

0

No estoy 100% seguro, pero parece que BufferedReader carga los datos en un Buffer en la RAM. Java puede usar 128mb Ram (a menos que se especifique lo contrario), por lo que es probable que el BufferedReader desborde la memoria de java causando un error. Trate de usar InputStreamReader y FileInputStream para leer y luego almacenar los datos en un char, luego simplemente escriba esa char usando un FileOutputStream.

Cuestiones relacionadas