MELHOR FORMA DE PROCESSAR MILHÕES DE DADOS

MGALDINO 23/08/2014 16:39:09
#440665
Boa tarde pessoal

Faz um bom tempo que não participo do fórum, mas sempre observo as duvidas e sugestões.
Hoje preciso de um sugestão, tentei processar 10 milhões de dados no C# e não consegui estourou a memoria do computador dualcore 2,95gz e 100Hd disponivel.

Minha aplicação acessa via ODBC uma base sybase IQ.
Processo:
Executa uma procedure retorna os dados e tentou carregar os dados em um datatable.

Existe uma melhor forma de trazer essa quantidade de dados para a aplicação?


OCELOT 25/08/2014 11:31:56
#440679
Resposta escolhida
A melhor forma seria não usando um DataSet/DataTable.

Se tem muitos dados pode não ter como carregar todos de uma vez na memória, você poderia usar um DataReader para ler e processar um de cada vez, já que o DataReader trabalha de forma conectada ao servidor ele vai usar muito menos memória.
PROFESSOR 25/08/2014 12:20:10
#440683
Márcio:

Como regra, a lide massas de dados são sempre operações críticas. Por essa razão é que se deve sempre especificar quais campos e quais filtros aplicar á uma consulta, independente de qual seja o SGDB ou a finalidade do aplicativo. Ter 10 milhões, ou 10000 registros [Ô]pendurados[Ô] em memória não tem utilidade efetiva, já que, em uma grade por exemplo, não estarão visíveis nem mesmo 100 deles.

Em relação especificamente á grades e outros componentes para visualização de massas de dados, há ainda um outro agravante, que é a carga de um cache extra para atualização de visualização (desenho) dos registros de acordo com formatações e composições distintas. Nesses componentes, desabilitar edição, destaques visuais e redimensionamento provoca uma enorme diferença no desempenho com grandes volumes.

Há, claro, ocasiões onde é necessário processar lotes de registros e mesmo o conjunto inteiro da tabela. Para essas situações, convenciona-se o uso de procedimentos armazenados no servidor e, mesmo assim, de forma cautelosa e criteriosa.

Dessa forma, na minha opinião pessoal, o que você quer fazer não é 100% adeqüado.

Mas respondendo, é possível, sim, dependendo do volume da massa de registros, assim que você:
1. - Deixe de usar camadas ODBC, que aumentam consideravelmente o fluxo de dados tanto na rede quanto na memória (cache) local. Em seu lugar, adote o provider .Net mais adequado ao serviço;
2. - Aplique o modo virtual em suas grades;
3. - Procure utilizar a Entity Framework e a LINQ, que proporcionam melhor desempenho quando bem estruturadas.

Note que, caso queira ir adiante, mesmo com a adoção desses dois pontos, a massa de dados ainda pode ter volume suficiente para provocar estouro de memória. é tudo questão de avaliação, ou seja, tentativa-e-erro.
Tópico encerrado , respostas não são mais permitidas