Delphi + firebird eOutOfMemory
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.
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.
Wallace
Curtidas 0
Respostas
Wilson Junior
01/03/2010
Por um acaso você utiliza Transação?
GOSTEI 0
Thiago Santana
01/03/2010
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
GOSTEI 0
Wallace
01/03/2010
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;
if Registro = 500 then begin
Registro := 0;
QSqlNovo.SQL.Text := 'COMMIT WORK';
QSqlNovo.ExecSQL;
QSqlNovo.Close;
ZNovo.Disconnect;
ZNovo.Connect;
end;
GOSTEI 0
Thiago Santana
01/03/2010
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!
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!
GOSTEI 0