MELHOR FORMA DE PROCESSAR MILHÕES DE DADOS
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?
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?
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.
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.
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.
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