Temos um requisito em nosso projeto para gerar um grande arquivo CSV a cada 2 horas usando um programa Java.
Este arquivo terá cerca de 60.000 linhas (cerca de 120 caracteres por linha). Ainda não tenho certeza do tamanho.
Gostaria de saber se me deparo com algum problema de memória, porque vou abrir o arquivo usando o FileWriter e continuar gravando e, finalmente, fechando o arquivo.
Devo me preocupar com o tamanho do arquivo? Se sim, existem outras boas técnicas para gravar em um arquivo grande em Java que não seja o FileWriter?
Estamos usando o Java 5.
Respostas:
Não, você não deveria. O objetivo de um arquivo é armazenar coisas fora da memória de acesso aleatório; o tamanho do FileWriter é constante e provavelmente muito pequeno, considerando tudo, mesmo que seja um FileWriter em buffer. A reescrita constante pode causar carga de E / S ou picos de CPU, mas quase certamente não falta de memória.
fonte
Como Killian Foth escreveu, você não deve ter nenhum problema: 60000 linhas não são tão grandes assim. Eu só queria sugerir que você use qualquer um dos analisadores de CSV gratuitos fornecidos aqui sob a iniciativa "Commons CSV" em http://commons.apache.org/csv/ em vez de escrever sua própria implementação.
Eu usei o Super CSV em alguns projetos e certamente não tive nenhum problema com isso.
fonte
Não use FileWriter. Não por questões de desempenho (as classes de E / S do Java não mantêm tudo na memória, as linhas de 60k não são nada, mesmo que o fizessem), mas porque não permite que você escolha a codificação de caracteres. Ele implicitamente usará a codificação padrão da plataforma, o que significa que o texto fora do ASCII pode ser corrompido.
Em vez disso, use um OutputStreamWriter envolvendo um FileOutputStream. Ou, melhor ainda, uma biblioteca CSV, que deve lidar com todos esses problemas.
fonte
Você pode considerar usar o BufferedWriter, embora isso provavelmente não ajude significativamente com o desempenho, é uma prática recomendada em qualquer caso, pois imagino que o número de linhas nem sempre será 60.000.
Você pensou em fechar o arquivo depois? Se você pretende ter muitos desses arquivos disponíveis, pode ser do seu interesse compactá-lo após a gravação, especialmente se você estiver criando esses arquivos uma vez a cada duas horas.
No que diz respeito à memória, você provavelmente não terá nada com que se preocupar, a menos que esteja trabalhando em um sistema com muito pouca memória; nesse caso, você deve usar o BufferedWriter e definir explicitamente o tamanho do buffer.
fonte