Pergunta

Saudações, Recebo grande número de registros de banco de dados e escreve em um file.I queria saber qual a melhor maneira de escrever arquivos enormes. (1GB - 10 GB).

Atualmente estou usando BufferedWriter

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

Solução

Se você realmente insistir usando Java para isso, então a melhor maneira seria escrever imediatamente , logo que os dados vem e, portanto, não para recolher todas os dados de ResultSet na memória do Java em primeiro lugar. Você precisaria de pelo menos essa quantidade de memória livre em Java contrário.

Assim, faça por exemplo.

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

Dito isso, mais decentes navios da DB com capacidades Export-to-CSV embutidas que são undoubtely forma mais eficiente do que você jamais poderia fazer em Java. Você não mencionou qual deles você está usando, mas se fosse, por exemplo, MySQL, você poderia ter usado o LOAD DATA INFILE para isso. Basta consultar a documentação específica do DB. Espero que isso dá novos insights.

Outras dicas

O tamanho do buffer padrão para um BufferedWriter é 8192. Se você estiver indo para ser escrito arquivos squigabyte, você pode querer aumentar esta usando o construtor 2 argumento; por exemplo.

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

Isso deve reduzir o número de syscalls necessários para gravar o arquivo.

Mas duvido que isso tornaria mais do que um par de diferença percentual. Puxando as linhas do conjunto de resultados será, provavelmente, o principal gargalo de desempenho. Para melhorias significativas no desempenho que você precisa para utilizar as instalações de exportação a granel nativas do banco de dados.

Eu não estou 100% de certeza, mas parece que tha cargas BufferedReader os dados em um buffer na RAM. Java pode usar 128MB de RAM (salvo indicação em contrário), de modo que o BufferedReader irá memória provável estouro de java causando um erro. Tente usar InputStreamReader e FileInputStream para ler e armazenar os dados em um char, em seguida, basta escrever esse caractere usando um FileOutputStream.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top