Melhoria de performance em arquivo txt

4 respostas
.netcsharp
Ace

Senhores bom dia,

Possuo uma rotina (Schedulle) que roda diariamente que basicamente realiza a leitura no banco e través do resultado faz algumas validações e escreve em um arquivo txt.

Porém o arquivo gerado passa das 50k linhas e este processo demora muito para finalizar.

Gostaria de saber se existe alguma possibilidade de após realizar as validações registro a registro que possuo em um dataset, armazenar isso em memória e gerar uma unica vez um txt?

Se houver, com certeza irei ganhar muito em desempenho!

Se alguém possuir alguma ideia ou algum exemplo, poderiam me dar uma força?

Abç.

4 Respostas

A

Bom dia,

Algumas perguntas:

  • O que quer dizer com demora muito? Segundos, minutos, horas?

  • Como você grava os dados do dataset para o arquivo hoje? Poste o código se possível.

  • Você mediu de alguma forma qual parte do processo demora mais? É realmente a geraçao do arquivo?

Ace

Olá Abel,

Para realizar todo o processo é em torno de 4hrs.

Realizei algumas verificações como por exemplo, o retorno dos resultados da query pela quantidade de registros requer em torno de 1m40s.

O código é bastante simples

comandoSel = new SqlCommand(vSQL, conexao);
                comandoSel.Connection.Open();
                comandoSel.CommandTimeout = 240;
                da.SelectCommand = comandoSel;
                da.Fill(dt);
                conexao.Close();
					
					StreamWriter valor = new StreamWriter(@vPath, false, Encoding.UTF8);
					
					foreach (DataRow linha in dt.Rows)
                {
						// 'N' validações
						
						valor.WriteLine('conteudo');							
					}
A

Algumas coisas que eu faria pra identificar/resolver isso:

  • Colocar uma mensagem de log (com timestamp) antes de rodar a query, depois de fechar a conexao, antes de rodar as validaçoes, após a validaçao e após escrever a linha. Com isso você conseguirá entender melhor qual ponto exatamente toma mais tempo.

  • Para testar sua idéia, você pode adicionar o conteúdo para um StringBuilder ao invés de escrever diretamente no arquivo, no final do loop você escreve o conteúdo do builder diretamente para o arquivo. Essa soluçao nao escala muito bem, pois dependendo do tamanho do arquivo vai consumir toda memória disponível, mas pode te ajudar a confirma se a escrita do arquivo é realmente lenta assim.

Ace

Fechado Abel,

Vou implementar essas possibilidades e avaliar qual a melhor solução.

Inclusive, o arquivo que está sendo escrito atualmente está na rede, isso provavelmente possa estar impactando também, vou escrever o arquivo localmente e posteriormente fazer uma cópia para a rede, pode ser que ajude também.

Abç.

Criado 8 de junho de 2017
Ultima resposta 8 de jun. de 2017
Respostas 4
Participantes 2