[firebase-br] Importação de TXT para FB, lenta...

Mr. Marshall kelsie.z.marshall em gmail.com
Ter Set 29 11:34:06 -03 2009


Moacir

Obrigado pela dica.

Eu conduzi testes aqui e confirmei que a inclusão direto na tabela é mais 
rápida.

O código abaixo levou 00:01:11 para incluir 76834 registros.
   try
   {
    DM->IBQuery1 ->Close();
    DM->IBQuery1 ->SQL->Clear();
    DM->IBQuery1 ->SQL->Add( AnsiString("INSERT INTO CLIENTES (NOMECLIENTE) 
VALUES (:NOMECLIENTE)"));
    DM->IBQuery1 ->ParamByName("NOMECLIENTE")->AsString  =  NOMECLIENTE;
    DM->IBQuery1 ->ExecSQL();
   }
   catch(...)
   {

   }

O código abaixo levou 00:01:05 para incluir 76834 registros.
   try
   {
      DM->IBTable1->Append();
      DM->IBTable1->FieldValues["NOMECLIENTE"] = NOMECLIENTE;
      DM->IBTable1->Post();
   }
   catch(...)
   {
       DM->IBTable1->Delete();
   }


Você realizou testes ou sua conclusão é impirica ?

OBS : Unidirecional = false acelera o processo, principalmente na Query




"Moacir - GMail" <prismars em gmail.com> wrote in 
message news:4AC207F6.9050707 em gmail.com...
Mr. Marshall,

Uma sugestão:

- Substitua o uso de Tables por Querys , com isto vc já estara obterá
ganho de velocidade.

Por Ex.:

 if((arqRead = fopen("clientes.txt"),"rt")) == NULL)
 {
   ShowMessage("Problema ao abrir o arquivo de importação plano.");
 }
 //-- AQUI
 With DM->IBQuery1 do
 begin
    SQL.text:='Insert into MinhaTabela (NOMECLIENTE) values (:NOME)';
 end;
//---------------
 fseek(arqRead, 0, SEEK_SET);
 while (!feof(arqRead))
 {
    fgets(str, 2048, arqRead);
    StrAnsi = AnsiString(str);
    //-- AQUI
    With DM->IBQuery1 do
     begin
          ParamByName('NOME').AsString := StrAnsi;
          ExecQuery;
     end;

     a cada 1000 da uma commit e reabre banco
     DM->IBTransaction1->Commit();
     DM->IBTransaction1->Active = true;
}
fclose(arqRead);

Sucesso !!

Moacir

Mr. Marshall escreveu:
> Qual a maneira mais rápida de fazer uma importação de um arquivo textto
> contendo registros ?
>
> Tenho um arquivo com dois milhões de registros que sempre vou precisar
> importar para dento do FB, tenho varrido este arquivo do inicio ao fim e
> tenho colocado os campos direto na tabela e a cada 100 mil faço um COMMIT
>
>  if((arqRead = fopen("clientes.txt"),"rt")) == NULL)
>  {
>    ShowMessage("Problema ao abrir o arquivo de importação plano.");
>  }
>  fseek(arqRead, 0, SEEK_SET);
>  while (!feof(arqRead))
>  {
>     fgets(str, 2048, arqRead);
>     StrAnsi = AnsiString(str);
>      DM->IBTable1->Append();
>      DM->IBTable1->FieldValues["NOMECLIENTE"] = StrAnsi ;
>      DM->IBTable1->Post();
>
>      a cada 1000 da uma commit e reabre banco
>      DM->IBTransaction1->Commit();
>      DM->IBTransaction1->Active = true;
> }
> fclose(arqRead);
>
> Está técnica funciona mas tem se demonstrado meio lenta, alguma sujestão
> para melhorar a performance da importação ?
>
>
> Mr. Marshall
> PS:
> Já li o artigo do Cantú sobre importação de TXT utilizando a técnica de 
> EXTERNAL FILE mas preciso fazer verificações antes de incluir os dados 
> poderia utilizar UDF mas...
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: 
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa






Mais detalhes sobre a lista de discussão lista