Clipper On Line • Ver Tópico - LENTIDAO PARA PESQUISAR DBF EM HARBOUR

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor EduardoSPno » 13 Fev 2020 19:23

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??

#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
EduardoSPno
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 03 Mai 2012 16:23
Cidade/Estado: Sao Paulo/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor JoséQuintas » 13 Fev 2020 20:23

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor Itamar M. Lins Jr. » 14 Fev 2020 07:21

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor EduardoSPno » 14 Fev 2020 11:46

Agradeço a ajuda colega JOSE QUINTAS ...

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

Muito agradecido a todos ...
EduardoSPno
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 03 Mai 2012 16:23
Cidade/Estado: Sao Paulo/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor Itamar M. Lins Jr. » 14 Fev 2020 14:35

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor JoséQuintas » 14 Fev 2020 17:47

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor EduardoSPno » 14 Fev 2020 20:10

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
EduardoSPno
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 03 Mai 2012 16:23
Cidade/Estado: Sao Paulo/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor EduardoSPno » 17 Fev 2020 13:02

Ola amigos Quintas e Itamar, tudo bem?!

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

Muito Obrigado
Anexos
FILTRO.zip
BANCO DE DADOS E FONTES EM CLIPPER E HARBOUR
(416.24 KiB) Baixado 166 vezes
EduardoSPno
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 59
Data de registro: 03 Mai 2012 16:23
Cidade/Estado: Sao Paulo/SP
Curtiu: 0 vez
Mens.Curtidas: 1 vez

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor Itamar M. Lins Jr. » 17 Fev 2020 15:26

Ola!
Aqui está demorando 1 segundo.
Captura de tela de 2020-02-17 15-20-03.png
Tela

Detalhe que não estou nem compilando estou executando via hbrun o prg.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor Kapiaba » 17 Fev 2020 16:04

Tente assim:

// 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.
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor Itamar M. Lins Jr. » 17 Fev 2020 16:57

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor JoséQuintas » 17 Fev 2020 17:41

test1.png
test1.png (7.32 KiB) Visualizado 4817 vezes


test2.png
test2.png (8.14 KiB) Visualizado 4817 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á....

      //@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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor JoséQuintas » 17 Fev 2020 17:50

Outra opção pra outras pesquisas mais demoradas, parecido com o que uso no meu gráfico, atualizando a cada 1 segundo:

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) Visualizado 4816 vezes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor JoséQuintas » 17 Fev 2020 18:02

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

LENTIDAO PARA PESQUISAR DBF EM HARBOUR

Mensagempor JoséQuintas » 17 Fev 2020 18:10

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...."
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18015
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro