DESALOCAR MEMORIA VB.NET
Bom dia,
Estou com um problema em um processamento onde :
Dim Reg as List
do
Resg = db.tabela.Where(Function(x) x.campo1 = x _
And x.campo= True _
).ToList()
.
.
.
registro.clear()
Loop
O meu problema é que a cada loop o a memória vai aumentando até exibir outofmemory...
já tentei dar registro = nothing
GC.Collect()
GC.WaitForPendingFinalizers()
Mas a memória não baixa...
Alguém já passou por isto?
Alguma sugestão?
Estou com um problema em um processamento onde :
Dim Reg as List
do
Resg = db.tabela.Where(Function(x) x.campo1 = x _
And x.campo= True _
).ToList()
.
.
.
registro.clear()
Loop
O meu problema é que a cada loop o a memória vai aumentando até exibir outofmemory...
já tentei dar registro = nothing
GC.Collect()
GC.WaitForPendingFinalizers()
Mas a memória não baixa...
Alguém já passou por isto?
Alguma sugestão?
Amigo, tenho quase certeza que você está fazendo de uma maneira muito pouco otimizada. O que você quer fazer exatamente?
Boa Tarde Kerplunk,
Trata-se de um sistema existente que começou apresentar problemas de out of memory devido aumento da quantidade de registros apresentadas.
Ele efetua leitura via entity framework e faz a gravação em .txt.
Modifiquei o sistema para efetuar as leitura dos registros via datareader. funcionou perfeito e o consumo de memória foi mÃnimo.
Se tiver alguma dica, pois não gostaria de alterar a consulta via entity, gostaria de saber uma maneira de [Ô]desalocar[Ô] este list que não sai da memoria cada vez que é alimentado.
realmente no código acima esta ruim mesmo... esta fazendo uma consulta a cada loop...
do
Resg = db.tabela.Where(Function(x) x.campo1 = x _
And x.campo= True _
).ToList()
.
.
.
for each reg in Resg
grava txt
next
registro.clear()
Loop
O loop em si executa umas 5 vezes. O for each que retorna bastante registro
Obrigado!
Trata-se de um sistema existente que começou apresentar problemas de out of memory devido aumento da quantidade de registros apresentadas.
Ele efetua leitura via entity framework e faz a gravação em .txt.
Modifiquei o sistema para efetuar as leitura dos registros via datareader. funcionou perfeito e o consumo de memória foi mÃnimo.
Se tiver alguma dica, pois não gostaria de alterar a consulta via entity, gostaria de saber uma maneira de [Ô]desalocar[Ô] este list que não sai da memoria cada vez que é alimentado.
realmente no código acima esta ruim mesmo... esta fazendo uma consulta a cada loop...
do
Resg = db.tabela.Where(Function(x) x.campo1 = x _
And x.campo= True _
).ToList()
.
.
.
for each reg in Resg
grava txt
next
registro.clear()
Loop
O loop em si executa umas 5 vezes. O for each que retorna bastante registro
Obrigado!
Certo. E o que deve se transformar? Tipo, o que vai ser gravado no TXT, que formato?
O txt gerado é de tamanho fixo, sendo que não preciso formatar ele pois o retorno da consulta já traz tudo formatado certinho.
uso um stringbuilder pra concatenar os campos [Ô]nome[Ô] [Ô]telefone[Ô] etc
e gravo em um arquivo via streamwriter.
a parte de gravar no txt esta bacana. O problema é a List que mesmo eu colocando nothing não sai da memória.
uso um stringbuilder pra concatenar os campos [Ô]nome[Ô] [Ô]telefone[Ô] etc
e gravo em um arquivo via streamwriter.
a parte de gravar no txt esta bacana. O problema é a List que mesmo eu colocando nothing não sai da memória.
A lista que você cria com o método [Ô]Where[Ô] é oriunda de uma instância de contexto de dados(no seu caso Entity Framework). Ela ficará na memória enquanto o Entity Framework estiver inicializado. Se você está instanciando [Ô]db[Ô] no construtor do formulário, as variáveis oriundas dele só serão disponibilizadas para o GAC quando [Ô]db[Ô] for descartado. Por isso, sempre use os blocos [Ô]using[Ô], ainda mais para contexto da dados.
Citação:
A lista que você cria com o método [Ô]Where[Ô] é oriunda de uma instância de contexto de dados(no seu caso Entity Framework). Ela ficará na memória enquanto o Entity Framework estiver inicializado. Se você está instanciando [Ô]db[Ô] no construtor do formulário, as variáveis oriundas dele só serão disponibilizadas para o GAC quando [Ô]db[Ô] for descartado. Por isso, sempre use os blocos [Ô]using[Ô], ainda mais para contexto da dados.
Complementando:
Mas para você não ficar abrindo e fechando seu contexto de dados a cada loop, você pode usar o método AsNoTracking. Ele não anexa o objeto na memória do contexto, ele apenas retorna as entidades da consulta. Isso deve resolver seu problema.
Obs: O AsNoTracking deve ser usado apenas quando você não precisa fazer um update nos seus dados de retorno.
Abraço!
Kerplunk e DS2T
Muito Obrigado Pelas dicas!
Vou aplicar aqui!
Muito Obrigado Pelas dicas!
Vou aplicar aqui!
DS2T Adicionei
Resg = db.tabela.AsNoTracking.Where(Function(x) x.campo1 = x _
And x.campo= True _
).ToList()
Problema resolvido
Muito Obrigado!
Resg = db.tabela.AsNoTracking.Where(Function(x) x.campo1 = x _
And x.campo= True _
).ToList()
Problema resolvido
Muito Obrigado!
ICHIHARA, se sua dúvida foi resolvida, encerre o tópico e pontue quem mais lhe auxiliou a sanar a dúvida
Tópico encerrado , respostas não são mais permitidas