Vazamento de memória em DataSet´s
Olá pessoal, tudo bem?
Primeiramente gostaria de cumprimentar a todos, este é meu primeiro post nessa comunidade. Cheguei aqui lendo uma edição da revista da ClubeDelphi (revista que a empresa em que trabalho possui assinatura).
Estou utilizando o Delphi 2007 Win32 e gostaria de saber se alguém já percebeu que quando é aberto um DataSet ele consome 2X de memória e quando o fechamos é liberado apenas X? Experimentem fazer um loop meio absurdo para entenderem o que estou dizendo:
Esse vazamento torna-se muito visível quando a tabela é relativamente grande (fiz esse teste com uma tabela com mais de 100 colunas).
Uma maneira que encontrei de ´resolver´ o problema em determinados casos foi criando o DataSet e liberando-o em tempo de execução, segue:
Mas em outros casos isso não é possível fazer dessa maneira. Tendo em vista também que o sistema fica meio ´xulo´ fazendo dessa maneira.
Alguém já se deparou com isso antes? Conseguiu resolver? Tem alguma sugestão ou apenas consegue me indicar um caminho de porque razão isso está acontecendo?
Desde já, muito obrigado e um bom ano novo a todos!
Primeiramente gostaria de cumprimentar a todos, este é meu primeiro post nessa comunidade. Cheguei aqui lendo uma edição da revista da ClubeDelphi (revista que a empresa em que trabalho possui assinatura).
Estou utilizando o Delphi 2007 Win32 e gostaria de saber se alguém já percebeu que quando é aberto um DataSet ele consome 2X de memória e quando o fechamos é liberado apenas X? Experimentem fazer um loop meio absurdo para entenderem o que estou dizendo:
while True do begin Application.ProcessMessages; SQLDataSet1.Close; SQLDataSet1.Params.ParamByName(´PARAMETRO´).AsInteger := 1; SQLDataSet1.Open; end;
Esse vazamento torna-se muito visível quando a tabela é relativamente grande (fiz esse teste com uma tabela com mais de 100 colunas).
Uma maneira que encontrei de ´resolver´ o problema em determinados casos foi criando o DataSet e liberando-o em tempo de execução, segue:
while True do begin Application.ProcessMessages; with Teste do begin Teste := TSQLDataSet.Create(Self); CommandText := ´select * from TABELA where PARAMETRO= :PARAMETRO´; SQLConnection := SQLConnection1; Params.CreateParam(ftUnknown, ´PARAMETRO´, ptUnknown); Params.ParamByName(´PARAMETRO´).AsInteger := 1; Open; FreeAndNil(Teste); end; end;
Mas em outros casos isso não é possível fazer dessa maneira. Tendo em vista também que o sistema fica meio ´xulo´ fazendo dessa maneira.
Alguém já se deparou com isso antes? Conseguiu resolver? Tem alguma sugestão ou apenas consegue me indicar um caminho de porque razão isso está acontecendo?
Desde já, muito obrigado e um bom ano novo a todos!
Woinch
Curtidas 0
Respostas
Woinch
07/01/2009
Desculpe por enviar outro post, mas não consegui editar o anterior...
Efetuei o teste anterior dentro de um loop finito no Delphi 2007 c/ DBX4, gravando a memória que estava sendo utilizada antes da execução e depois. Sei que não serve como parâmetro, mas percebi que nessa situação o sistema alocou cerca de 80M de memória enquanto em Delphi 7 alocou apenas 20M. Alguém possui Delphi 2006 para efetuar o mesmo teste c/ DBX3?
Parece que esse problema já existe nas versões anteriores do Delphi, mas acredito que se agravou com o DBX4.
Efetuei o teste anterior dentro de um loop finito no Delphi 2007 c/ DBX4, gravando a memória que estava sendo utilizada antes da execução e depois. Sei que não serve como parâmetro, mas percebi que nessa situação o sistema alocou cerca de 80M de memória enquanto em Delphi 7 alocou apenas 20M. Alguém possui Delphi 2006 para efetuar o mesmo teste c/ DBX3?
Parece que esse problema já existe nas versões anteriores do Delphi, mas acredito que se agravou com o DBX4.
GOSTEI 0
Fabriciocolombo
07/01/2009
Para vc realmente saber se está havendo vazamento de memória, utilize o FastMM([url]http://sourceforge.net/projects/fastmm/[/url]). Se vc estiver utilizando o Gerenciador de Tarefas para acompanhar o gerenciamento da memória, saiba que isto não serve como parâmetro, pois nem toda memória alocada com a criação de um objeto é imediatamente liberada, pois o SO presume que vc pode vir a utilizar essa area da memória novamente.
GOSTEI 0
Woinch
07/01/2009
Consegui resolver essa encrenca utilizando um driver de terceiro para conexão ao banco de dados. Ele não possui esse vazamento absurdo de memória.
Obrigado!
Obrigado!
GOSTEI 0
Johnny-walker
07/01/2009
Amigo apenas informe qual driver vc estava utilizando antes e qual resolveiu seu problema...
Assim fica para posterior pesquisas a outros usuários que venham ater o mesmo problema...
bye
Assim fica para posterior pesquisas a outros usuários que venham ater o mesmo problema...
bye
GOSTEI 0
Woinch
07/01/2009
Estava usando o nativo do Delphi: dbxora30.dll
Agora estou utilizando um terceiro da Devart: dbexpoda40.dll
Obrigado! :D
Agora estou utilizando um terceiro da Devart: dbexpoda40.dll
Obrigado! :D
GOSTEI 0