Tenemos un requisito en nuestro proyecto para generar un gran archivo CSV cada 2 horas utilizando un programa Java.
Este archivo tendrá alrededor de 60,000 líneas (alrededor de 120 caracteres por línea). Todavía no estoy seguro del tamaño.
Me gustaría saber si me encontraría con algún problema de memoria porque abriré el archivo usando FileWriter y luego seguiré escribiendo y finalmente cerraré el archivo.
¿Debería preocuparme por el tamaño del archivo? En caso afirmativo, ¿hay otras buenas técnicas para escribir en un archivo grande en Java que no sea el uso de FileWriter?
Estamos usando Java 5.
Respuestas:
No, no deberías El objetivo de un archivo es almacenar cosas fuera de la memoria de acceso aleatorio; el tamaño de FileWriter es constante, y es probable que sea bastante pequeño, considerando todo, incluso si se trata de un FileWriter almacenado en búfer. La reescritura constante puede causar una carga de E / S o picos de CPU, pero casi seguro que no hay escasez de memoria.
fuente
Como Killian Foth lo escribió, no debería tener ningún problema, 60000 líneas no es tan grande. Solo quería sugerirle que use cualquiera de los analizadores de CSV gratuitos proporcionados aquí bajo la iniciativa "Commons CSV" en http://commons.apache.org/csv/ en lugar de escribir su propia implementación.
He usado Super CSV para algunos proyectos y ciertamente no tuve ningún problema con él.
fuente
No use FileWriter. No por problemas de rendimiento (las clases IO de Java no guardan todo en la memoria, ut 60k líneas no son nada, incluso si lo hicieran), sino porque no le permite elegir la codificación de caracteres. Implícitamente usará la codificación predeterminada de la plataforma, lo que significa que el texto fuera de ASCII puede corromperse.
En su lugar, use un OutputStreamWriter envolviendo un FileOutputStream. O, mejor aún, una biblioteca CSV, que debería manejar todos estos problemas.
fuente
Puede considerar usar BufferedWriter, aunque eso probablemente no ayudará significativamente con el rendimiento, es una práctica recomendada en cualquier caso, ya que imagino que el número de líneas no siempre será de 60,000.
¿Has considerado comprimir el archivo después? Si tiene la intención de tener muchos de estos archivos, podría ser mejor para usted comprimirlos después de haberlos escrito, especialmente si va a crear estos archivos una vez cada dos horas.
En lo que respecta a la memoria, probablemente no tenga nada de qué preocuparse a menos que esté trabajando en un sistema con muy poca memoria, en cuyo caso debe usar BufferedWriter y establecer explícitamente el tamaño del búfer.
fuente