Página 1 de 1

Lentidão na criação de indices em HARBOUR!

Enviado: 13 Jul 2015 11:38
por ANDRIL
Pessoal, passei meu sistema Clipper52/Blinker para Harbour 3.2 modo CONSOLE. Sempre usei DBFCDX, porem em clipper usava a extensao IDX. No Harbour, deixei como CDX mesmo. Não uso TAGs.

O que notei foi uma grande demora para criação dos indices em Harbour, o que em Clipper demorava em torno de 45seg, em Harbour demorou mais de 5 min.

Será que fiz algo errado na criação dos indices para deixá-los tão lentos? Tem alguma forma de deixá-los rápidos na criação como em Clipper.

Código: Selecionar todos

       REQUEST DBFCDX 
        RDDSETDEFAULT("DBFCDX")
        Extensao=".CDX"
O cliente já ficou com o pé atrás, visto que sempre que se faz algo como UPGRADE espera-se que melhore!

Ate+

Lentidão na criação de indices em HARBOUR!

Enviado: 13 Jul 2015 14:52
por JoséQuintas
A única coisa que poderia ficar mais lenta no Harbour seria atualização de tela.
Por acaso tem gráfico de processamento?
Se tiver, ajuste pra não ficar atualizando a tela a cada registro.

Lentidão na criação de indices em HARBOUR!

Enviado: 14 Jul 2015 09:54
por ANDRIL
José, tem sim. Realmente era o uso de função de andamento na criação do índice. O interessante é que a mesma função no Clipper roda bem, já no Harbour apresenta tal lerdeza!

Fiquei aliviado quando tirei a função e ficou até mais rápido que em Clipper. Agora vou ver como criu uma alternativa, para informar ao usuário que o sistema esta trabalhando, por que quando o índice for grande eles sempre pensam que o sistema "TRAVOU!".

Obrigado, até+

Lentidão na criação de indices em HARBOUR!

Enviado: 14 Jul 2015 20:36
por JoséQuintas
Uma alternativa simples é atualizar somente a cada um segundo.

Se quiser minha rotina com cálculo de tempo.
Em harbourdoc.com.br, user interface, www.harbourdoc.com.br, GrafTime()
link direto: http://www.harbourdoc.com.br/show.asp?s ... GrafTime()

Basicamente pra usar poderia ser:

Código: Selecionar todos

GrafTime( "Fazendo reindexação" )
INDEX ON .... TO ... EVAL GrafTime( RecNo(), LastRec() )
ou

Código: Selecionar todos

nAtual := 0
nTotal := LastRec()
GrafTtime( "Fazendo processamento" )
DO WHILE .NOT. Eof()
   GrafTime( nAtual++, nTotal )
   SKIP
ENDDO
A rotina usa as duas últimas linhas da tela para o gráfico.

Nota:
Já comentei por aqui, a coisa mais difícil de eu fazer é reindexar.
Se ocorrer uma vez cada dois meses, pra mim ainda considero muito, já que é bem eventual mesmo.
Sempre foi assim, desde os tempos do Clipper.

Aqui uso um cálculo de LastRec() + ( LastRec() * Qtd. índices ), somando de todos os arquivos, pra ter um gráfico da reindexação total, e não individual. (a reindexação também faz o "pack")

Lentidão na criação de indices em HARBOUR!

Enviado: 14 Jul 2015 21:44
por Itamar M. Lins Jr.
Use comando index com EVERY! mais simples e vai ficar muito rápido.
Só o every ou outra forma similar; chamar o gráfico a cada n registros processados n pode ser 50 ou 100...
Evite chamar o gráfico a cada skip do dbf.

Saudações,
Itamar M. Lins Jr.

Lentidão na criação de indices em HARBOUR!

Enviado: 14 Jul 2015 22:44
por ANDRIL
Pessoal, obrigado pelas dicas. Vou fazer alguns testes e reporto aqui.
Ate+

Lentidão na criação de indices em HARBOUR!

Enviado: 15 Jul 2015 10:26
por JoséQuintas
Essa rotina que fiz afeta muito menos a velocidade do que o gráfico a cada registro, porque a demora maior é mesmo atualização de tela e rede.
Mas usando o every junto com a rotina vai agilizar mais ainda, porque reduz a quantidade de cálculos/checagens.

Lentidão na criação de indices em HARBOUR!

Enviado: 15 Jul 2015 11:09
por ANDRIL
Usei a claúsula EVAL junto com EVERY usando a mesma função que já usava e funcionou como em Clipper. Realmente em Harbour a atualização da tela demora mais que em Clipper se for atualiza-la a cada registro, mesmo compilando em modo console.

Questão resolvida. Obrigado a todos.
Ate+

Lentidão na criação de indices em HARBOUR!

Enviado: 15 Jul 2015 12:36
por alxsts
Olá!

Só acrescentando: pode usar o Every a cada 10% dos registros da tabela [ Int( ( LatRec() /100) ) ]