[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