Delphi + firebird eOutOfMemory

01/03/2010

3

Galera eh o seguinte, estou fazendo uma importacao de um cliente novo e uma das tabelas ha mais de 18mil registro de imagens, o banco esta com mais de 4gbs. Quanto a importacao tranquilo, o problema eh que por volta do registro 16mil da uma erro "Out of Memory".

segue parte do codigo:

  select ....
  while select not Eof do begin
    QSqlNovo.SQL.Text := 'INSERT INTO FO_FOTO (FO_ID, ...) '+
                        'VALUES (:FO_ID, ...)';
    if not SelectAntigo.FieldByName('PSVEFO_ID').IsNull then
      QSqlNovo.ParamByName('FO_ID').Value := SelectAntigo.FieldByName('PSVEFO_ID').Value;
    QSqlNovo.ExecSQL;
    QSqlNovo.Close;
    Progresso.Position := Progresso.Position + 1;
    SelectAntigo.Next;
    inc(Registro);
  end;

O que fazer nessa situação?!

utilizo Delphi 7 + Zeos + Firebird 2.0.
Responder

Posts

01/03/2010

Wilson Junior

Por um acaso você utiliza Transação?
Responder

01/03/2010

Thiago Santana

Wallace já fiz uma exportação bem maior do que este porte e ocorria este mesmo erro! No meu problema era porque estava armazenando tudo em memória... Então criei um contador e coloquei que a cada 500 registros por exemplo ele iria gravar no banco e não juntando todos os registros para gravar de uma só vez, pois juntando todos para gravar td no final ficava muito pesado para a memoria do sistema! Tente fazer isso crie um contador e coloque para gravar em mais ou menos a cada 500 registros... Isso deve resolver teu problema! Espero ter ajudado... AbraçoO
Responder

01/03/2010

Wallace

fala tiago, viu tentei usar uma variavel e usei o seguinte comando para gravar no banco sem sucesso.

    if Registro = 500 then begin
      Registro := 0;
      QSqlNovo.SQL.Text := 'COMMIT WORK';
      QSqlNovo.ExecSQL;
      QSqlNovo.Close;
      ZNovo.Disconnect;
      ZNovo.Connect;
    end;
Responder

01/03/2010

Thiago Santana

Não eh bem isso que tentei te explicar olha vc deverá usar um componente de Transição no meu caso utilizo componentes da IBO e tenho um componente chamando IB_Transaction, vou te passar um exemplo aqui para vc dá uma olhada:   procedure TFrmExportar.ExportarCidades;
var
  X : integer; // Meu contador
begin
  X := 0; //Zerei meu contador 
  Dm.TbCidadesParadox.First; //Primeiro registro da tabela
  ProgressBar1.Max := Dm.TbCidadesParadox.RecordCount; //Meu progressBar
  Dm.TbCidadesParadox.DisableControls;
  while not Dm.TbCidadesParadox.eof do begin // Laço de repetição para chegar até o fim da tabela
     Dm.QueryCidadesFire.Append; // Novo Registro
     Dm.QueryCidadesFire.Fieldbyname('C_CODCIDADE').AsInteger   := Dm.TbCidadesParadoxC_CODIGO.AsInteger;
     Dm.QueryCidadesFire.FieldByName('C_CIDADE').AsString       := Dm.TbCidadesParadoxC_LOCALIDADE.AsString;
     Dm.QueryCidadesFire.FieldByName('C_UF').AsString           := Dm.TbCidadesParadoxC_UF.AsString;
     Dm.QueryCidadesFire.Post;
     Label1.Caption := 'Cidade: ' + Dm.TbCidadesParadoxC_LOCALIDADE.AsString;
     Label1.Repaint;
     Dm.TbCidadesParadox.Next; //Vai para o próximo registro da tabela
     ProgressBar1.Position := Dm.TbCidadesParadox.RecNo; //Coloca o progressBar para caminhar
     Inc(x); // Incrementei meu contador vc pode utilizar X:= X + 1;
     if X > 500 then begin // teste para gravar de 500 em 500 registros
        Dm.QueryCidadesFire.IB_Transaction.CommitRetaining; // Utilizando meu componente de transição para gravar
        X := 0; // Zerei meu contador para iniciar a contagem e gravar os próximos 500
      end;
  end;
// Caso não tenha menos de 500 registro irá gravar o restante   Dm.TbCidadesParadox.EnableControls;
  Dm.QueryCidadesFire.IB_Transaction.CommitRetaining;
  Dm.QueryCidadesFire.Refresh; // Atualizei a tabela   MessageDlg('Expotação de Cidades efetuada com sucesso!', mtInformation, mbOKCancel,0);
  Label1.Caption:= 'Foram exportada(s) ' + (IntToStr (Dm.TbCidadesParadox.RecordCount)) + ' cidade(s).';
end;   Essa eh uma exportação de dados de um Banco Paradox para Firebird!   Com isso vc poderá resolver teu problema... espero ter ajudado!
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira