Melhoria de performance em arquivo txt

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ç.

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?

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');							
					}

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.

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ç.