Clipper On Line • Ver Tópico - Acesso simultâneo a arquivo DBF em rede lento

Acesso simultâneo a arquivo DBF em rede lento

Discussão sobre a biblioteca Fivewin - O Clipper para Windows.

Moderador: Moderadores

 

Acesso simultâneo a arquivo DBF em rede lento

Mensagempor Yury » 05 Mar 2013 09:10

olá pessoal, bom dia

creio q esse assunto já foi abordado aqui no fórum, mas pesquisei todos os links e não encontrei uma solução

vou descrever o "problema":

uma determinada estação da rede (chamarei de terminal A) chama um programa que lê um arquivo DBF indexado (CDX) por um campo tipo DATA, utilizando DBSEEK, e demora 20 segundos para finalizar a leitura do arquivo no intervalo solicitado

agora outra estação (chamarei de terminal B) chama o mesmo programa, sendo que a primeira estação que chamou (terminal A) ainda está executando o programa ; o tempo de execução do programa no terminal B até finalizar a leitura dos registros agora é de 1 minuto

se o terminal A chamar novamente o programa, sem que o terminal B abandone, o tempo para finalizar também é de 1 minuto, ou seja, demora nas duas estações o mesmo tempo de 1 minuto quando o acesso ao programa é simultâneo

quando 1 dos terminais abandona o programa, o terminal que permanece executando volta a obter o resultado em 20 segundos

já isolei os trechos do programa e constatei que:

- a "abertura dos arquivos" com DBUSEAREA mantém a mesma velocidade acessando por 1 terminal ou pelos 2 terminais
- o "fechamento dos arquivos" com CLOSE mantém a mesma velocidade acessando por 1 terminal ou pelos 2 terminais
- a velocidade de leitura no while acessando por um terminal é muito mais rápida do que quando está acessando pelos 2 terminais

portanto é o LOOP que está sendo afetado pelo acesso simultâneo, perdendo desempenho

informações sobre o ambiente onde foi testado isso:

- servidor com Windows Server 2012 Standart
- terminais com Windows 7 Professional

nas pesquisas que fiz sobre o assunto me deparei com inúmeras dicas falando sobre o cabeamento da rede, placa de rede, anti-vírus, etc...

mas posso lhes adiantar que a rede está funcionando ok e as estações em que foi testado estão com anti-vírus desabilitado e firewall do windows liberando arquivos DBF, CDX, FPT, etc... (testamos em várias estações)

inclusive em um cliente que reclamou dessa situação o comportamento é o mesmo, testamos em várias estações também para comprovar

a rotina q estamos utilizando para testar é muito simples:


#include 'FiveWin.ch'

Function Teste()

cTime:=TIME()

Select 1
Use "M:\TESTE.DBF" Alias "NF" Shared
Set index to "M:\TESTE.CDX"

dDataIni  := CTOD("01/01/2013")
dDataFim  := DATE()
nContador := 0

NF->(DBSETORDER(1))
NF->(DBSEEK(DTOS(dDataIni),.T.))
WHILE !NF->(EOF()) .and. NF->NFDATA <= dDataFim

   nContador++
   NF->(DBSKIP())

ENDDO

? 'Tempo da leitura dos registros: ' + CRLF +;
  ElapTime(cTime,TIME())             + CRLF +;
  NETNAME()                          + CRLF +;
  ALLTRIM(STR(nContador))+' registros lidos' 
 
// permanecer com esta mensagem em exibição e chamar o programa de outro
// terminal

CLOSE ALL

RETURN

//-----------------------------------------------------------------------------


foi compilado com xHB build 1.1.0 (SimpLex) / BCC 5.5.1 / FW 8.01

agradeço qualquer dica

obrigado
Yury
Yury
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 2
Data de registro: 05 Mar 2013 08:57
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Acesso simultâneo a arquivo DBF em rede lento

Mensagempor fladimir » 05 Mar 2013 12:40

Colega tente criar um filtro antes de varrer o mesmo isso dá um ganho considerável de velocidade.

#include 'FiveWin.ch'

Function Teste()

cTime:=TIME()

Select 1
Use "M:\TESTE.DBF" Alias "NF" Shared
Set index to "M:\TESTE.CDX"

dDataIni  := CTOD("01/01/2013")
dDataFim  := DATE()
nContador := 0

INDEX ON NF->NFDATA TO iTEMP                             ; //aki fazemos um filtro via indice
  FOR NF->NFDATA >= dDataINI .AND. NF->NFDATA <= dDataFim
/*
   NF->(DBSETORDER(1))                                 
   NF->(DBSEEK(DTOS(dDataIni),.T.))
   WHILE !NF->(EOF()) .and. NF->NFDATA <= dDataFim
*/
   WHILE !NF->(EOF())              // Ai vc varre a area indexada filtrada
    nContador++
    NF->(DBSKIP())
   ENDDO

? 'Tempo da leitura dos registros: ' + CRLF +;
ElapTime(cTime,TIME())      + CRLF +;
NETNAME()             + CRLF +;
ALLTRIM(STR(nContador))+' registros lidos'

// permanecer com esta mensagem em exibição e chamar o programa de outro
// terminal

CLOSE ALL
RETURN


Testa e veja se resolve...

[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar de usuário

fladimir
Colaborador

Colaborador
 
Mensagens: 2434
Data de registro: 15 Nov 2006 19:21
Curtiu: 28 vezes
Mens.Curtidas: 157 vezes

Acesso simultâneo a arquivo DBF em rede lento

Mensagempor lugab » 05 Mar 2013 14:25

Complementando o q o Fladimir sugeriu, considere que gastar 20 segundos para um seek simples em um DBf+CDX , é tempo demais.

Também é bom re-avaliar o hardware usado, a cabeação, etc.

Qual é mesmo o sistema operacional do servidor e das estações ?

Ha relatos q servidor 2003 não tem bom desempenho com estações seven, p.ex.
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Acesso simultâneo a arquivo DBF em rede lento

Mensagempor Yury » 07 Mar 2013 14:45

obrigado pelas dicas, vou avaliar e testar

sobre o ambiente:

- servidor com Windows Server 2012 Standart
- terminais com Windows 7 Professional

sobre cabeação e hardware, todas as verificações foram realizadas, podemos garantir que o "problema" não tem relação com isso

bom, qualquer novidade eu posto aqui

obrigado
Yury

PS: na verdade oq eu gostaria de deixar claro sobre o post é que não estou questionando o desempenho em si do programa e sim que esse desempenho não se mantenha constante (diminui sensivelmente) quando 2 terminais acessam os mesmos arquivos ao mesmo tempo ; veja q não estou falando de 50 estações, mas somente de duas estações ! se o problema fosse unica e exclusivamente o desempenho, encontrariámos formas de otimizar a rotina (vide idéia do índice temporário apresentado pelo fladimir) , mas a questão é que executando por um terminal é rápido e por 2 terminais é muito mais lento
Yury
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 2
Data de registro: 05 Mar 2013 08:57
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez




Retornar para FiveWin

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 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