Out of Memory - Tentei corrigir mas ainda persiste o erro
Bom dia pessoal. Estou com esse problema de Out of Memory quando eu entro em um while de uma query. Quando o resultado da Query é pequeno não acontece nada, porém se o resultado for muito grande esse erro aparece pra mim "Out of Memory". Eu criei essa procedure:
No final do while, após o Query.Next eu chamo a procedure. Ela funciona, estou acompanhando o consumo de memória pelo gerenciador de tarefas. A memória sem a procedure chega em 40k e com a procedure chega no máximo em 20k, mas mesmo assim ainda está dando o Out of Memory.
Alguém teria uma solução pra isso?
procedure TfGeraSpedFiscal.LimparMemoria;
var
MainHandle: THandle;
begin
Try
MainHandle := OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId);
SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF);
CloseHandle(MainHandle);
Except
end;
Application.ProcessMessages;
end;
No final do while, após o Query.Next eu chamo a procedure. Ela funciona, estou acompanhando o consumo de memória pelo gerenciador de tarefas. A memória sem a procedure chega em 40k e com a procedure chega no máximo em 20k, mas mesmo assim ainda está dando o Out of Memory.
Alguém teria uma solução pra isso?
Marlon Minotti
Curtidas 0
Melhor post
Flávyo Henrique
12/12/2014
Tira todos os With e veja se já ajuda, muitos erros acontecem por causa deles.
GOSTEI 1
Mais Respostas
Douglas
06/12/2014
Olá Marlon, tudo bem?
Você sempre chama a procedure LimparMemoria após o next da Query, ou somente quando finaliza o processo da mesma?
Você sempre chama a procedure LimparMemoria após o next da Query, ou somente quando finaliza o processo da mesma?
GOSTEI 0
Marlon Minotti
06/12/2014
Eu chamo a procedure sempre após o Next da query, no intuito de que quando eu passar um registro ele me limpe a memoria, para que não fique acumulando. Como eu citei, realmente diminui o consumo da memória, porém ainda recebo o Out of Memory
GOSTEI 0
Douglas
06/12/2014
Marlon, Já tentou chamar a procedure LimparMemoria após a execução de toda a Query? Tente desta forma e depois verifique o consumo. Aguardo feedback.
GOSTEI 0
Marlon Minotti
06/12/2014
Sim, já tentei executar a procedure antes da query, depois da query e depois da procedure que contem a query e o consumo de memória diminui, porém dá o erro.
GOSTEI 0
Douglas
06/12/2014
Marlon, vamos fazer o seguinte. Poste aqui o restante do seu código para analisarmos o que está acontecendo.
GOSTEI 0
Marlon Minotti
06/12/2014
procedure TfGeraSpedFiscal.addProd;
begin
initStatus('Gerando produtos');
loadDataProd(qEmpresa.FieldBYName('codigo').asInteger);
verificaCFOP(xCodEmpresa);
With qItem1 Do
Begin
With SPED.Bloco_0 Do
Begin
Last;
initStatus('Gerando produtos', qItem1.RecordCount);
First;
While Not qItem1.Eof Do
Begin
updStatus;
qItem6.Close;
qItem6.ParamByName('codProd').AsString := qItem1.FieldByName('CODIGO').AsString;
qItem6.Open;
qItem6.First;
With Registro0200New Do
Begin
COD_ITEM := FieldByName('CODIGO').asString;
DESCR_ITEM := trim(Trim(FieldByName('NOME').asString) + ' ' + Trim(FieldByName('APRESENTACAO').asString));
COD_BARRA := trim(Copy(FieldByName('CODIGO_BARRA').asString, 0, 13));
UNID_INV := FieldByName('UND_MED').asString;
if UNID_INV = '' then
begin
UNID_INV := DescrUndMed;
end;
if qItem6.FieldByName('CFOP').AsString = '1556' then
TIPO_ITEM := tiMaterialConsumo
else
begin
TIPO_ITEM := tiMercadoriaRevenda;
COD_NCM := trim(Copy(_soNumero(FieldByName('NCM').asString), 1, 8));
end;
EX_IPI := '';
COD_GEN := Copy(_soNumero(FieldByName('NCM').asString), 1, 2);
COD_LST := '';
End;
qItem1.Next;
limparMemoria;
End;
End;
End;
end;
GOSTEI 0
Douglas
06/12/2014
Marlon, uma pergunta. Você já tentou executar este código sem a chamar a procedure limparMemoria?
GOSTEI 0
Marlon Minotti
06/12/2014
Sim, já tentei. A princípio era assim, porém eu tiver que criar essa procedure para tentar aliviar o consumo de memória, porém sem sucesso.
GOSTEI 0