Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vierra

Programa com consumo absurdo de memória

Recommended Posts

Olá a todos,

Na empresa que trabalho temos um sistema que faz a replicação entre dois bds (SQL Server). O mesmo ao passar dias chega a quase 4 gigas de ram fazendo com que trave a maquina.

 

Tem a tela principal e o data modulo, no data modulo tenho os componentes: TADOConnection e algumas TADOQuerys.

 

Na tela principal só fazemos consulta e inserção... Já mudei o código para fechar as conexões após todo o processo, também desconecto e conecto os TADOConnection, mas continua do mesmo jeito.

 

Alguém pode me explicar o que está acontecendo e como posso resolver isto?

Será que os registros que vão para as querys estão ficando em memoria?

Um close na query e um connection false não resolvem o caso dos registros em memoria?

 

Sim, meu primeiro post por aqui... Agradeço por tudo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, fica meio difícil dar uma idéia do porque sem ter como analisar o programa, mas se, por exemplo, estiver criando os componentes em runtime sem liberá-los da memória no final do processo, isso poderia ser uma das causas.... acho que você tem que primeiro identificar como o processo está sendo feito, se ele usa componentes que podem estar ficando presos em memória mesmo após o seu término.... geralmente este é um dos problemas mais comuns pra este tipo de situação.... uso de ponteiros de memória que são criados e não são liberados, componentes criados em runtime... há N possibilidades.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Chrnos,

Os componentes já estão no datamodulo (não são criados em runtime)... Já não sei mais o que fazer.

 

Caso não encontre alguma resposta para isto, vou tentar criar todos os componentes de conexão em runtime e depois retirá-los da memória (free).

 

Mesmo assim muito obrigado pela resposta e fico no aguardo de mais comentários!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez se você detalhar melhor o processo de replicação fique mais fácil do pessoal opinar e dar sugestões.... por exemplo, que BD usa? Há bancos que permitem você trabalhar com o Bulk Insert, que permite gerar uma exportação dos dados pra um arquivo csv e depois reimportá-lo usando recursos do próprio BD.... poderia ser uma alternativa interessante pra um processo de replicação... já fiz alguns em que exportava os registros via Bulk Insert do BD de origem, depois reimportava os registros pra uma tabela auxiliar no BD destino e chamava uma procedure que aplicava as regras em cima dos dados importados no BD destino... não onerava tanto a memória e deixava todo o controle das transações de dados dentro do BD.

 

Eu sei que há casos em que o Delphi não libera corretamente o espaço alocado pelos seus componentes... mas, como disse, sem ver como o processo está estruturado é meio difícil opinar... de todo modo, boa sorte!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma melhor analise e percebi que varias query's criadas em tempo de execução não estavam sendo fechadas, acarretando no alto consumo de memória.

 

Mesmo assim, muito obrigado!

 

Resposta: Liberei as query's da memória.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.