Página 1 de 3

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 13 Fev 2020 19:23
por EduardoSPno
Boa noite amigos, preciso de uma ajuda, utilizo em um cliente uma rotina bem simples para criar um DBF (PROD.DBF) com o resultado de uma pesquisa a partir de um outro DBF (PRODUTO.DBF), onde o cliente digita por exemplo "AMARELO" e a rotina joga todos os produtos que contenham a palavra AMARELO no arquivos destino (PROD.DBF), bem isso em CLIPPER levava em media 2 segundos, no HARBOUR leva 8 segundos, o arquivo origem (PRODUTO.DBF) contem 22.000 registros, o que pode ser??

Código: Selecionar todos

#include "hbgtinfo.ch"
#include "wvtwin.ch"
#include "hbgtwvg.ch"
#include "hbdyn.ch"
#include "inkey.ch"

REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
REQUEST HB_GT_WVT_DEFAULT
REQUEST HB_GT_WVT

Function Main()  //no PRG principal (inicial) tem que ter esta funcao MAIN

CLS
CLOSE ALL

SELECT 1
USE PRODUTO
IF ! FILE("ACESS.NTX") .OR. !FILE("EDU.NTX")
   INDEX ON CODIGO    TO ACESS
   INDEX ON DESCRICAO TO EDU
   SET INDEX TO ACESS, EDU
ELSE
   SET INDEX TO ACESS, EDU
ENDIF

SELECT 2
USE PROD
ZAP

DO WHILE .T.
cPESQ=SPACE(30)
@10,10 SAY "PESQUISA ..: " GET cPESQ PICTURE [@K!]
READ

IF LASTKEY()=27
   EXIT
ENDIF

T1=TIME()
xTOT=0
xTEM=0

SELECT PROD
ZAP

SELECT PRODUTO
SET ORDER TO 2
GO TOP
DO WHILE !EOF()
   xTEM++
   IF ALLTRIM(cPESQ) $ PRODUTO->DESCRICAO   //procuro primeiro parte no nome
      xTOT++

      SELECT PROD
      DBAPPEND()
      REPLACE CODIGO WITH PRODUTO->CODIGO, DESCRICAO WITH PRODUTO->DESCRICAO,;
              PRECOVENDA WITH PRODUTO->PRECOVENDA, ESTOQUE WITH PRODUTO->ESTOQUE

      SELECT PRODUTO
   ENDIF
   @15,10 SAY xTOT
   @15,25 SAY xTEM

  SKIP
ENDDO
T2=TIME()

@18,10 SAY T1
@19,10 SAY T2
ENDDO

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 13 Fev 2020 20:23
por JoséQuintas
antivírus
programa de segurança de banco - WARSAW
registro excluído
índice NTX, que não tem nada melhorado por ser igual Clipper
programador deixando mais lento
Windows sem tempo de fazer o trabalho dele
problema na rede
etc

Como agilizar:

- Se vai pesquisar o arquivo inteiro de produtos, não tem sentido usar índice
- Usar Inkey() dentro do DO WHILE é bom, porque precisa liberar tempo pro Windows fazer a parte dele
- Índice CDX nem faz diferença nesse caso, talvez NSX se tiver a opção de indexar qualquer palavra

NÃO SEI se hbnetio agilizaria alguma coisa, apesar de fazer por TCP/IP, não é otimizado.
LetToDBF parece otimizar muito.
Apenas como último recurso, ADS Local Server pra ser mais instantâneo mesmo com DBF, último recurso porque pode precisar ajustes nos fontes.
Apesar que.... o Harbour tem lib pra ele, pode ser que usar isso deixe tudo mais rápido - terá que testar e pesquisar como gerar a lib, não faço idéia sobre isso, mas sei que no harbour-users alguns usam.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 14 Fev 2020 07:21
por Itamar M. Lins Jr.
Ola!
Eu trabalho com DBF e LetoDbf
Arquivos com 70 mil itens até mais(autopeças) pq só faz aumentar, rede com 12 maquinas.
O tempo que leva é o tempo do usuário pressionar a tecla. A resposta é instantânea!

Saudações,
Itamar M. Lins Jr.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 14 Fev 2020 11:46
por EduardoSPno
Agradeço a ajuda colega JOSE QUINTAS ...

O colega ITAMAR poderia me auxiliar com algum exemplo do LetoDbf ??

Muito agradecido a todos ...

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 14 Fev 2020 14:35
por Itamar M. Lins Jr.
Ola!
Primeira coisa é demonstrar que no clipper leva 2 segundos e no Harbour 8.
Pq não tem nem sentido 16bits ser mais rápido que 32bits.
Precisamos dos seus bancos de dados, para fazermos os testes aqui nas nossas máquinas.
Para ver se reamente em clipper é mais rápido, para podermos detectar o BUG do harbour e avisar para os GURUS, lá do DEV do Harbour.
Sem mexer em nada.
Tem com demonstrar o problema com algum exemplo, no qual possamos repetir os testes nas nossas máquinas ?

Para depois irmos para outra abordagem que é o LetoDBf.
Pq estou vendo pelo seu código que o arquivo está sendo usando de forma exclusiva, vc não está em rede.

Saudações,
Itamar M. Lins Jr.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 14 Fev 2020 17:47
por JoséQuintas
Itamar M. Lins Jr. escreveu:Primeira coisa é demonstrar que no clipper leva 2 segundos e no Harbour 8.
Pq não tem nem sentido 16bits ser mais rápido que 32bits.
Uma coisa que usuários já comprovaram aqui é que NTX é muito mais lento que CDX.
Mas no caso dele, nem índice precisa, melhor abrir somente o DBF e nada mais.

Só depois disso ver outra coisa.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 14 Fev 2020 20:10
por EduardoSPno
Sim colega Itamar, nesse exemplo fiz no modo exclusivo, mas posso lhe enviar o BD e tb essa função em rede, que a propósito ocorre o mesmo problema ...

Como posso lhe enviar?

Muito Obrigado

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 13:02
por EduardoSPno
Ola amigos Quintas e Itamar, tudo bem?!

Conforme solicitado estou enviando em anexo o BD e os FONTES, clipper e Harbour ..

Muito Obrigado

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 15:26
por Itamar M. Lins Jr.
Ola!
Aqui está demorando 1 segundo.
Tela
Tela
Detalhe que não estou nem compilando estou executando via hbrun o prg.

Saudações,
Itamar M. Lins Jr.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 16:04
por Kapiaba
Tente assim:

Código: Selecionar todos

// CABECALHO(s)

ANNOUNCE RDDSYS

REQUEST DBFNTX

FUNCTION FILTRO()

   CLS
   CLOSE ALL

   //********** so pra deixar vazio !!
   USE PROD EXCLUSIVE NEW
   ZAP
   CLOSE

   RDDSETDEFAULT("DBFNTX")

   IF ABREARQ( "PRODUTO", "PRODUTO", .F. , 10 )

      IF .NOT. FILE ( "ACESS.NTX" ) .OR. .NOT. FILE( "EDUP.NTX" )

         INDEX ON CODIGO    TO ACESS
         INDEX ON DESCRICAO TO EDUP

      ENDIF

      SET INDEX TO ACESS, EDUP

   ELSE

      ALERT( "N„o foi poss¡vel abrir o arquivo de Produtos" )

   ENDIF


   IF ABREARQ( "PROD", "PROD", .F. , 10 )
   ELSE
      ALERT( "N„o foi poss¡vel abrir o arquivo de Produtos" )
   ENDIF

   DO WHILE .T.

      cPESQ = SPACE( 30 )
      @10, 10 SAY "PESQUISA ..: " GET cPESQ PICTURE [@K!]
      READ

      IF LASTKEY() = 27
         EXIT
      ENDIF

      T1 = TIME()

      xTOT = 0
      xTEM = 0

      SELECT PRODUTO
      SET ORDER TO 2
      GO TOP

      DO WHILE !EOF()

         xTEM++

         IF ALLTRIM( cPESQ ) $ PRODUTO->DESCRICAO   //procuro primeiro parte no nome

            xTOT++

            SELECT PROD
            DBAPPEND()

            RLOCK()

            REPLACE CODIGO     WITH PRODUTO->CODIGO,     ;
                    DESCRICAO  WITH PRODUTO->DESCRICAO,  ;
                    PRECOVENDA WITH PRODUTO->PRECOVENDA, ;
                    ESTOQUE    WITH PRODUTO->ESTOQUE

            COMMIT

         ENDIF

         @15, 10 SAY xTOT
         @15, 25 SAY xTEM

         SELECT PRODUTO

         SKIP

      ENDDO

      UNLOCK

      T2 = TIME()

      @18, 10 SAY T1
      @19, 10 SAY T2

   ENDDO

RETURN NIL
Abs.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 16:57
por Itamar M. Lins Jr.
Ola!
Kapiaba, o arquivo está aberto de forma exclusiva, não precisa nem de rlock, nem commit.
O commit é feito quando encerra "close all"
É apenas um teste para ver se vai demorar 8 segundos, para criar o arquivo com o resultado.
Testei em um computador antigo "Intel Celeron 847 1.1GHz"

Saudações,
Itamar M. Lins Jr.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 17:41
por JoséQuintas
test1.png
test1.png (7.32 KiB) Exibido 5544 vezes
test2.png
test2.png (8.14 KiB) Exibido 5544 vezes
Ou com meu gráfico que calcula previsão de tempo restante, mas nem dá tempo de ver...:
test3.png

Elementar:
Atualizar a tela 21.516 vezes.... só console mesmo, e olhe lá....

Código: Selecionar todos

      //@15,10 SAY xTOT
      //@15,25 SAY xTEM
Nota:
O segredo do meu gráfico é que ele atualiza a tela somente a cada UM SEGUNDO, e não a cada registro, só isso basta pra ele não atrapalhar.
E por ser a cada 1 segundo... não deu tempo de mostrar o processamento.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 17:50
por JoséQuintas
Outra opção pra outras pesquisas mais demoradas, parecido com o que uso no meu gráfico, atualizando a cada 1 segundo:

Código: Selecionar todos

cTime := Time()
DO WHILE ! EOf()
....
IF cTime != Time()
    @15,10 SAY xTOT
    @15,25 SAY xTEM
   cTime := Time()
ENDIF
test4.png
test4.png (6.51 KiB) Exibido 5543 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 18:02
por JoséQuintas
Faltou dizer:

- Pesquisei "JOSE", e não encontrou nada, apenas fez o processamento.

- Em Harbour usa janela gráfica nem sei se GTWVG/GTWVW/GTWVT, porque usa função de todas.
Não tem a ver com a LIB, mas com atualizar tela gráfica 20.000 vezes mesmo.
Seria o mesmo que numa lib "mais GUI" ficar repintando a tela, e fazendo um "refresh" ou algo assim pro texto aparecer.
A pesquisa acaba esperando a tela ser atualizada antes de prosseguir com a pesquisa.

- Dá pra deixar mais rápido mas.... menos de 1 segundo já tá bom.... rs
Apenas bloqueei a atualização de tela.

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Enviado: 17 Fev 2020 18:10
por JoséQuintas
IMPORTANTE:

Apesar de ser uma coisa relativamente "boba", podem existir mais usuários com problema parecido.

1) ATUALIZAR TELA É DEMORADO, PRINCIPALMENTE TELA GRÁFICA.
Isso pode passar desapercebido quando o Windows "toma conta das janelas", e decide atualizar só de vez em quando.
Na dúvida, mesmo em tela gráfica, convém fazer tratamentos desse tipo.

2) Também precisa Inkey(), DoEvents() ou algo parecido, quando realmente precisar que a tela seja atualizada.
Isso não é automático: se o programa ficar trabalhando muito sem liberar tempo pro Windows, o Windows fica sem tempo de atualizar a tela, e pode até considerar que o programa travou.
Geralmente é aquele caso aonde o programa demora, e se clicar o Windows diz "o programa não está respondendo e será fechado...."