alguem consegue um algoritmo mais rapido ?
04/04/2006
0
strSql:=´SELECT COMPE_DES, BANCO_DES, AGENCIA_DES,CONTA_DES, NUMERO_DOC, ´; strSql := strSql + ´VALOR, SEQ_REG, FLAG ´; strSql := strSql + ´FROM ´+sTabelaEntrada; Application.ProcessMessages; with qryExecutaSQL do begin close; sql.clear; sql.add(strSql); open; First; end; Temp := TStringList.Create; Temp.LoadFromFile(Parametros.Path_Sistema+ ´CAS.TXT´); lblCont_Mensagem.Visible := True; cont := 0 ; for i := 0 to Temp.Count - 1 do begin if ( copy( Temp.Strings[i], 01, 01) = ´N´ ) then if ( copy( Temp.Strings[i], 14, 02) <> ´07´) and ( copy( Temp.Strings[i], 20, 04) <> ´0041´) then if ( copy( Temp.Strings[i], 51, 02) <> ´36´) and ( copy( Temp.Strings[i], 51, 02) <> ´01´) then begin qryUpdateSql( ´UPDATE ´ + sTabelaEntrada + ´ SET FLAG = ´ +#39´*´+39+ ´ WHERE COMPE_DES = ´+39+copy(Temp.Strings[i],67,03)+39+ ´ AND BANCO_DES = ´+39+copy( Temp.Strings[i], 83, 03) +39+ ´ AND AGENCIA_DES = ´+39+copy( Temp.Strings[i], 86, 04) +39+ ´ AND CONTA_DES LIKE ´+39+´¬´+copy(Temp.Strings[i],98,10) + ´¬´ +39+ ´ AND NUMERO_DOC = ´+39+copy(Temp.Strings[i],70,06)+39+ ´ AND VALOR LIKE ´+39+´¬´+copy(Temp.Strings[i],30,16)+´¬´+39+´ ´); cont := cont + 1; lblCont.Caption := IntToStr( cont ); Application.ProcessMessages; end; // if end; // for
este algoritimo até está funcionando bem com arquivos pequenos até 5.000 registros mais quando passa disso ai eu acho que fica meio demorado.
obs: o sistema chega a processar arquivos de mais de 50.000 registros
Não sei se estou fazendo da melhor maneira.
Se alguem puder me ajudar eu agradeço !!!
Fabiano Góes
Posts
04/04/2006
Marioguedes
Sugiro então que você leia o TXT com as rotinas ReadLn e assim talvez ter um desempenho mais adequado.
04/04/2006
Aloizio Castro
Faz o teste ae..
Abraços
04/04/2006
Fabiano Góes
Ler texto com Stringlist é mais lento que ler com ReadLn ?????
porque ?
-----------------------------------------------------------
marioguedes
qual a logica de usar ´BeginUpdate e EndUpdate´
não entendi porque isso deixaria o processamento mais rapido
05/04/2006
Fabiano Góes
Em um processamento de 7.000 registros leva ´00:04:30 hs´
Quatro minutos e meio
levando em consideração que o sistema deve processar arquivos de até
80.000 registros
acho que está demorado !!!!
05/04/2006
Massuda
Outra coisa que deve ajudar é evitar usar a procedure Copy. Como uma string é um array of Char, seu código pode ser reescrito assim...
var S: string; ... S := Temp.Strings[i]; // ou o que for lido com ReadLn ... if ( S[1] = ´N´ ) then if not (( S[14] = ´0´ ) and ( S[15] = ´7´ )) and ...
05/04/2006
Paullsoftware
Ler texto com Stringlist é mais lento que ler com ReadLn ?????
porque ?
[/quote:a74211ab20]
sim é mais lento!
[quote:a74211ab20=´Fabiano Góes´]
porque ?
[/quote:a74211ab20]
quando vc cria um StringList e você carregada o conteúdo de um txt para ela vc já ocupa dois espaços na memória, o do txt e da StringList levando em conta que o tamanho da StringList vai de acordo com a memória virtual disponível no micro...
fiz um teste aqui em um txt com 20.000 registros e obtive os resultados
depois fiz um teste tratando os dados antes de iniciar a transação, nesse caso somente inicio uma transação se houver alterações...
sendo assim:
Eu uso StringList mais, somente quando os dados a serem importados são poucos, ou seja, não passam dos 10.000 registros
[b:a74211ab20]Detalhe[/b:a74211ab20] Configuração do Micro[list:a74211ab20]
Cyrix 300
128Mb
Hd 4.3GB
Windows 98[/list:u:a74211ab20] :wink:
05/04/2006
Andremuller
05/04/2006
Andremuller
06/04/2006
Fabiano Góes
Rjun, qryUpdateSql é uma procedureque recebe uma instrução SQL neste caso como uso ela apenas para Update coloquei este nome
procedure qryUpdateSql( strSql : String ); begin with qry do begin close; sql.clear; sql.add( strSql ); execSql; end; end;
10/04/2006
Fabiano Góes
var strSql : String; strSql := ´UPDATE ´ + sTabelaEntrada + ´ SET FLAG = ´ +#39´*´+39+ ´ WHERE COMPE_DES = ´+39+copy(Temp.Strings[i],67,03)+39+ ´ AND BANCO_DES = ´+39+copy( Temp.Strings[i], 83, 03) +39+ ´ AND AGENCIA_DES = ´+39+copy( Temp.Strings[i], 86, 04) +39+ ´ AND CONTA_DES LIKE ´+39+´¬´+copy(Temp.Strings[i],98,10) + ´¬´ +39+ ´ AND NUMERO_DOC = ´+39+copy(Temp.Strings[i],70,06)+39+ ´ AND VALOR LIKE ´+39+´¬´+copy(Temp.Strings[i],30,16)+´¬´+39+´ ´; with qryUpdate do begin close; sql.clear; sql.add( strSql ); sql.execSql; end;
Clique aqui para fazer login e interagir na Comunidade :)