Out of Memory - Tentei corrigir mas ainda persiste o erro

Delphi

06/12/2014

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:

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

Marlon Minotti

Curtidas 0

Melhor post

Flávyo Henrique

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

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?
GOSTEI 0
Marlon Minotti

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

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

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

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

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

Douglas

06/12/2014

Marlon, uma pergunta. Você já tentou executar este código sem a chamar a procedure limparMemoria?
GOSTEI 0
Marlon Minotti

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
POSTAR