Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wBB

XML: Como tornar a pesquisa mais rápida?

Recommended Posts

Pessoal,

Tenho que acessar um arquivo XML grande, com muitos resgistros, e pegar apenas algumas poucas informações. Da forma como estou fazendo hoje está muito lento e gostaria de saber se alguém pode me orientar para fazer algo que fique mais rápido para procurar as informações no arquivo.

 

Normalmente o arquivo tem uns 5000 registros de cidades, mas separei algumas apenas para postar aqui o formato:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<weather>
  <region name="Acre" local="national">
	  <city name="Acrelândia">
	  <day1 date="07/02/2008" low="23" high="30" prob="80" quant="10" condition="Chuvoso" icon="5" /> 
	  <day2 date="08/02/2008" low="21" high="32" prob="70" quant="05" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day3 date="09/02/2008" low="22" high="33" prob="70" quant="10" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day4 date="10/02/2008" low="23" high="33" prob="70" quant="15" condition="Sol, nuvens e chuva" icon="4" /> 
	  </city>
	  <city name="Assis Brasil">
	  <day1 date="07/02/2008" low="21" high="28" prob="80" quant="10" condition="Chuvoso" icon="5" /> 
	  <day2 date="08/02/2008" low="19" high="30" prob="70" quant="05" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day3 date="09/02/2008" low="20" high="31" prob="70" quant="10" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day4 date="10/02/2008" low="21" high="31" prob="70" quant="15" condition="Sol, nuvens e chuva" icon="4" /> 
	  </city>
	  <city name="Brasiléia">
	  <day1 date="07/02/2008" low="22" high="29" prob="80" quant="10" condition="Chuvoso" icon="5" /> 
	  <day2 date="08/02/2008" low="20" high="31" prob="70" quant="05" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day3 date="09/02/2008" low="21" high="32" prob="70" quant="10" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day4 date="10/02/2008" low="22" high="32" prob="70" quant="15" condition="Sol, nuvens e chuva" icon="4" /> 
	  </city>
	  <city name="Bujari">
	  <day1 date="07/02/2008" low="23" high="30" prob="80" quant="10" condition="Chuvoso" icon="5" /> 
	  <day2 date="08/02/2008" low="21" high="32" prob="70" quant="05" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day3 date="09/02/2008" low="22" high="33" prob="70" quant="10" condition="Sol, nuvens e chuva" icon="4" /> 
	  <day4 date="10/02/2008" low="23" high="33" prob="70" quant="15" condition="Sol, nuvens e chuva" icon="4" /> 
	  </city>
  </region>
</weather>

A forma como estou acessando é:

Set rssXML = CreateObject("Microsoft.XMLDOM") 
rssXML.async = False

If rssXML.Load("bigplan.xml") Then

	lowrSP = ""
	highSP = ""
	iconSP = 0
	
	TEMP_MIN = "Min. "
	TEMP_MAX = "Max. "
	GRAUS = "° C"

	TOTAL_SP = 0	

	Set REGIAO = rssXML.documentElement
	TOTAL_REGIAO = REGIAO.childNodes.length	
	
	For i = 0 To (TOTAL_REGIAO - 1)
		NOME_REGIAO = Cstr(REGIAO.CHILDNODES.ITEM(i).getAttribute("name"))
	
		Select Case NOME_REGIAO

		case "São Paulo"
			set CIDADE = REGIAO.childNodes.item(i).childNodes
			TOTAL_CIDADE = CIDADE.length
			For j = 0 to (TOTAL_CIDADE - 1)
				NOME_CIDADE = Cstr(CIDADE.item(j).getAttribute("name"))
				Select Case NOME_CIDADE
					case "São Paulo"
						set TEMPO = CIDADE.item(j).getElementsByTagName("day1") 
						lowrSP = TEMP_MIN & Cstr(TEMPO.item(0).getAttribute("low")) & GRAUS
						highSP = TEMP_MAX & Cstr(TEMPO.item(0).getAttribute("high")) & GRAUS
						iconSP = Cstr(TEMPO.item(0).getAttribute("icon"))
						TOTAL_SP = TOTAL_SP + 1
						if TOTAL_SP = 4 then exit for
				End Select
			Next
			
		End Select
		
	Next ' Next For
	
end if

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se adianta alguma coisa: acesando XML via ADO. No momento estou sem a possibilidade de tentar criar algo e testar, se conseguir poste, se não conseguir vá postando que vamos tentando ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Salgado.

Neste caso está sendo usado o ADO para acessar um banco de dados e guardar as informações encontradas em um arquivo XML. Em seguida, para ler as informações do XML é feito o carregamento do arquivo todo. Para que seja encontrada uma informação neste arquivo também é necessário passar registro a registro, até encontrar a informação (a menos que eu tenha entendido errado e dê para fazer um "Select" no XML). Essa busca de informação registro a registro é o que preciso evitar, pois como o XML que uso tem muitos registros, a busca acaba ficando lenta.

 

Mesmo assim obrigado pela dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu to com um probleminha pareceido, meu caso é com dados de estatistica

acabei achando uma propriedade no xml que pode ser funcional pro seu caso

 

set oTela = objXMLDOM.selectSingleNode ("./root/tela [@id=xx]")

 

xml:

<root>

<tela id="xx">

 

te ajuda em alguma coisa?

[]s

 

eu to com um probleminha pareceido, meu caso é com dados de estatistica

acabei achando uma propriedade no xml que pode ser funcional pro seu caso

 

set oTela = objXMLDOM.selectSingleNode ("./root/tela [@id=xx]")

 

xml:

<root>

<tela id="xx">

 

te ajuda em alguma coisa?

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, para ser bem sincero não consegui detectar diferença nos tempos de pesquisa entre este método e o métido que eu vinha usando, com loop "For". Porém, fiz poucos testes e ainda não tive oportunidade de colocar o código em produção, o que me impede de passar a informação correta quanto a velocidade.

 

Independente de velocidade, gostaria de comentar que este método simplifica muito o código e pode ser bem útil em várias outras aplicações. No meu caso a rotina pôde ser substituída literalmente por meia-dúzia de linhas:

 

set REGIAO = rssXML.selectSingleNode ("./weather/region [@name='São Paulo']") 
set CIDADE = REGIAO.selectSingleNode ("./city [@name='São Paulo']") 
set TEMPO = CIDADE.getElementsByTagName("day1") 
lowrSVD = TEMPO.item(0).getAttribute("low")
highSVD = TEMPO.item(0).getAttribute("high")
iconSVD = Cstr(TEMPO.item(0).getAttribute("icon"))
Só tem que ficar esperto com os níveis dos Nodes para não confundir na hora de fazer a referência e verificar os valores dos atributos.

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao esse codigo serviu pra sua aplicacao?

eu to trabalhando com ele tb... ou pelo menos tentando ainda por causa da estrutura do xml

 

 

de qto em qto tempo o arquivo é atualizado?

eles disponibilizam um novo a cada dia?

 

ja tentou fazer uma rotina pra separar os estados?

acho que seria melhor você ter 26 xml do que um so com 1 zilhao de linha

na hora de consultar você iria direto no xml do estado ai consultava a cidade

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao esse codigo serviu pra sua aplicacao?

Serviu, mas agora que fiz mais testes verifiquei que ainda não atende apenas na questão de velocidade de acesso, que é lento tanto quanto o que eu já vinha usando.

 

de qto em qto tempo o arquivo é atualizado?

Não me lembro exatamente, mas acho que é atualizado a cada hora.

 

ja tentou fazer uma rotina pra separar os estados?

Já está sendo separado por estado quando é feito:

set REGIAO = rssXML.selectSingleNode ("./weather/region [@name=São Paulo]")

 

acho que seria melhor você ter 26 xml do que um so com 1 zilhao de linha

Também acho, mas a aplicação não aceita esta divisão. O arquivo já teria que chegar pré-dividido para uso, mas não tenho como fazer isso (ao menos não sei ainda).

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas eu ja imaginava que fosse tudo num xml so com 30000000000000000000 de linhas, por isso falei pra dividir usando asp e nao dividir na hora da consulta

 

criar um sistema em asp que vai pegar cada bloco de estados e criar um respectivo xml e gravar as informacoes

 

 

ai quando você for listar o rj, va carrega o xml do rio

 

request.QueryString("estado")

request.QueryString("cidade")

 

If rssXML.Load(estado&".xml") Then

set REGIAO = rssXML.selectSingleNode ("./weather/region [@name=estado]")

set CIDADE = REGIAO.selectSingleNode ("./city [@name=cidade]")

 

+- isso

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora o que você disse, porém dessa vez não consegui implementar. Baseado no exemplo do XML que passei no início do tópico teria como você me mostrar como implementar esse código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o meu problema maior seria com o a leitura mesmo do xml, mas vou tentar fazer um sistema aqui pra testar e te mostro

 

 

é assim a estrutura de estados e cidades ne

 

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<weather>

  <region name="Acre" local="national">
	<city name="Acrelândia">
	<day1 date="07/02/2008" low="23" high="30" prob="80" quant="10" condition="Chuvoso" icon="5" /> 
	<day2 date="08/02/2008" low="21" high="32" prob="70" quant="05" condition="Sol, nuvens e chuva" icon="4" /> 
	<day3 date="09/02/2008" low="22" high="33" prob="70" quant="10" condition="Sol, nuvens e chuva" icon="4" /> 
	<day4 date="10/02/2008" low="23" high="33" prob="70" quant="15" condition="Sol, nuvens e chuva" icon="4" /> 
	</city>
  </region>

  <region name="Rio" local="national">
	<city name="Rio">
	<day1 date="07/02/2008" low="23" high="30" prob="80" quant="10" condition="Chuvoso" icon="5" /> 
	<day2 date="08/02/2008" low="21" high="32" prob="70" quant="05" condition="Sol, nuvens e chuva" icon="4" /> 
	<day3 date="09/02/2008" low="22" high="33" prob="70" quant="10" condition="Sol, nuvens e chuva" icon="4" /> 
	<day4 date="10/02/2008" low="23" high="33" prob="70" quant="15" condition="Sol, nuvens e chuva" icon="4" /> 
	</city>
  </region>

</weather>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.