Pregunta

Saludos, Consigo gran número de registros de base de datos y escribir en un file.I se preguntaba cuál es la mejor manera de escribir archivos de gran tamaño. (1 GB - 10 Gb).

Actualmente estoy usando BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
 //do writings
}
mbrWriter.close();
¿Fue útil?

Solución

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 todos los datos de ResultSet en la memoria de Java en primer lugar. Usted necesitaría al menos esa cantidad de memoria libre en Java lo contrario.

Por lo tanto, hacer por ejemplo.

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. Usted no ha mencionado que se está utilizando, pero si fuera por ejemplo MySQL, se podría haber utilizado el LOAD DATA INFILE para esto. Sólo se refieren la documentación específica del DB. Espero que esto da nuevos conocimientos.

Otros consejos

El tamaño de búfer predeterminado para un BufferedWriter es 8192. Si va a estar escribiendo archivos squigabyte, es posible que desee aumentar este utilizando el constructor 2 argumento; por ejemplo.

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

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

Pero dudo que esto haría más que un par de diferencia porcentual. Tirando de filas del conjunto de resultados será probablemente el principal cuello de botella. Para las mejoras significativas en el rendimiento que había necesidad de utilizar las instalaciones de exportación a granel nativos de la base de datos.

No estoy 100% seguro, pero parece tha BufferedReader carga los datos en un buffer en la memoria RAM. Java puede utilizar 128 MB de RAM (a menos que se especifique lo contrario), por lo que el BufferedReader es probable que la memoria de Java desbordamiento causando un error. Intente utilizar InputStreamReader y FileInputStream para leer y luego almacenar los datos en un char, a continuación, sólo escribir que Char utilizando un FileOutputStream.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top