none
Limitações de DataTable RRS feed

  • Pergunta

  • Atualmente estou com um problema interessante. Segundo o que entendi no MSDN, um datatable consegue armazenar cerca de 16 milhões de linhas (salvo limitações de hardware), no entanto estou tentando realizar uma query que me retornaria cerca de 1,5 milhões de linhas e o sistema me acusa estouro de memória. O micro onde eu inicialmente realizei os testes possui 1Gb de RAM, testei então em outro micro, com 2Gb e o erro é acusado da mesma forma e sempre ao tentar armazenar a linha de número 1048576 (em ambos os micros). Fato que eu achei interessante pois esse valor é exatamente 2 elevado a 20ª. Procurei utilizar o Medidor de Desempenho para monitorar a memória durante a realização da query e não vi nada de mais. Alguém sabe se há alguma limitação real dos datatables para armazenar dados além do volume de memória do micro?

    Só uma observação, para saber exatamente em qual linha o erro ocorre parei de utilizar DataAdapter e passei a ler os dados via DataReader, armazenando linha por linha em um DataTable.
    segunda-feira, 3 de dezembro de 2007 18:47

Todas as Respostas

  • Fala, Anderson. Tudo bem?

     

    Acho que depende muito do tamanho de cada registro seu.

     

    Falar que o DataTable armazena 16 milhões de linhas é uma verdade, mas isso num cenário ideal, e não algo que possa ser conseguido sempre, entende?

     

    Creio que o melhor caminho pra você agora é repensar sua lógica. Descobrir uma maneira melhor de se obter o resultado que você precisa. Retornar uma query de 1.5 milhões de registros numa paula só não é algo muito comum.

     

    Se ainda assim for indispensável você fazer essa consulta, vc pode usasr threads que retornam registros de 100 mil em cem mil.

     

    Você teria quinze threads preenchendo quinze datatables, por exemplo. Se os datatables não aguentarem os 100 mil registros, aumente o número de datatables e diminua o número de registros dentro deles.

     

    É apenas uma sugestão.

     

    Abraço

    terça-feira, 4 de dezembro de 2007 11:32
  • OK! No entanto, isso realmente seria um problema pois estes dados precisariam ser repassados para uma rotina que geraria um produto sobre eles.
    Naturalmente nada que não possa ser adaptado mas, o que mais me intrigou foi o fato de o erro de memória (Out of Memory) ter ocorrido em duas máquinas, relativamente idênticas, com quantidades de memória diferentes (1 Gb e 2 Gb) e sempre com a mesmoa quantidade de linhas baixadas (1048576 linhas). Depois de postar este erro tentei baixar uma outra massa de dados contendo apenas duas colunas e ele funcionou normalmente, ou seja, de fato o problema está na quantidade de colunas.
    terça-feira, 4 de dezembro de 2007 15:19
  • Então. Foi justamente como eu te disse. Depende do cenário. No outro post eu pensei comigo mas não escrevi : "Seu problema deve ser o número de colunas"...

     

    Por mais que vc entupa a máquina com memória, o .NET tem seu gerenciador de memória interno, digamos assim. Ele não permitiria que um único objeto ocupasse uma memória absurda, entendeu Wink Por isso tanto fez, 1gb ou 2gb, o comportamento foi igual. A exceção "Out of Memory" pipoca na tela justamente por causa desse gerenciamento de memória. Se ele não existisse, sua aplicação iria dar um crash na máquina.

     

    Abraço

     

     

     

     

     

    terça-feira, 4 de dezembro de 2007 16:45
  • Anderson,

     

    nunca verifiquei se o DataTable possui ou não alguma limitação. Pela limitação de 16 milhões de linhas que você citou, eu acho que mesmo havendo esse número, não quer dizer que ele deve ser utilizado até o limite, pois é preciso considerar em que condições esses testes foram feitos. Você realmente precisa de uma quantidade de linhas tão grande (1,5 milhão)?

     

     


    Ricardo Oneda
    http://oneda.mvps.org/blog

    quarta-feira, 5 de dezembro de 2007 19:03