Acesso simultâneo a arquivo DBF em rede lento

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

Moderador: Moderadores

Yury
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 05 Mar 2013 08:57
Localização: Leme/SP

Acesso simultâneo a arquivo DBF em rede lento

Mensagem por Yury »

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:

Código: Selecionar todos


#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
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Acesso simultâneo a arquivo DBF em rede lento

Mensagem por fladimir »

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

Código: Selecionar todos

#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.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Acesso simultâneo a arquivo DBF em rede lento

Mensagem por lugab »

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
Yury
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 05 Mar 2013 08:57
Localização: Leme/SP

Acesso simultâneo a arquivo DBF em rede lento

Mensagem por Yury »

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
Responder