Ir para conteúdo

Arquivado

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

mushthielv

Pesquisa lenta em script com PostgreSQL

Recommended Posts

O meu sistema funciona da seguinte maneira: Tenho 1517 sensores que armazenam em cada dia do ano, uma certa precipitação que é medida de três em três horas durante todo o dia. Tenho uma tabela chamada pontos que tem as seguintes colunas: gid (que é a chave primária de cada sensor), latitude, longitude. E tenho uma outra tabela chamada historico que tem as seguintes colunas: id (que é a chave primária de cada historico), datah, horah, precipitacaoh, gidgeo_fk (que é a chave estrangeira que represente os sensores). Fiz um script em python para armazenar cada sensor em um arquivo chamado sensor.csv, que armazena também cada hora distinta em outro arquivo chamado data.csv, e armazena também a precipitação e hora em arquivos separados. Depois crio um arquivo que faz um relacionamento entre todos estes pontos. O problema é que são 1517 sensores, e eu estava testando isso pra ver se dava tudo certo para 1 sensor apenas, ou seja, ele pega um sensor e armazena todo o histórico deste sensor em arquivos, juntamente com os relacionamentos, mas isso está demorando 192 minutos mais ou menos, PARA APENAS UM SENSOR, pra fazer isso para 1517 sensores iria levar mais de 200 dias! Gostaria que alguém me ajudasse a diminuir este tempo drasticamente, sem ter que mexer em index e etc. Creio que seja o jeito que estou programando o meu script, mas não sei onde estou programando errado. Alguém pode me ajudar? Abaixo está o código do meu script.

import psycopg2
import csv



conn = psycopg2.connect("\
	dbname='bdTrmmTest'\
	user='postgres'\
	host='127.0.0.1'\
	password='1234'\
	");


#input()
csv_sensor = open('sensor.csv',"w")
csv_data = open('data.csv',"w")
csv_hora = open('hora.csv',"w")
csv_precipitacao = open('precipitacao.csv',"w")
csv_rels = open('rels.csv',"w")
labelSensor = 'Sensor'
labelData = 'Data'
labelHora = 'Hora'
labelPrecip = 'Precipitacao'
labelAS = 'AS'
labelEM = 'EM'
labelREGISTROU = 'REGISTROU'
contGeral = 0



c = conn.cursor()
c1 = conn.cursor()
c2 = conn.cursor()
c3 = conn.cursor()


writer = csv.writer(csv_sensor)
writer2 = csv.writer(csv_data)
writer3 = csv.writer(csv_hora)
writer4 = csv.writer(csv_precipitacao)
writer5 = csv.writer(csv_rels)
writer.writerow(('name:ID', 'IDPostgres', 'latitude', 'longitude', ':LABEL'))
writer2.writerow(('data:ID','vdata',':LABEL'))
writer3.writerow(('hora:ID','vhora',':LABEL'))
writer4.writerow(('precip:ID','valor',':LABEL'))
writer5.writerow((':START_ID',':END_ID',':TYPE'))
		
	
c.execute("SELECT DISTINCT gid, latitude, longitude FROM pontos LIMIT 1")
c1.execute("SELECT DISTINCT datah FROM historico")
c3.execute("SELECT DISTINCT horah FROM historico")

	
records = c.fetchall()
records1 = c1.fetchall()
records3 = c3.fetchall()
	
for contSensor in records:
	print("Escrevendo sensor %d"%(contSensor[0]))
	writer.writerow((contGeral,contSensor[0], contSensor[1], contSensor[2], labelSensor))
	print("Sensor %d escrito"%(contSensor[0]))		
	contSensorFlag = contGeral
	
		
	contGeral += 1
	for contReg in records1:
			
		contData = contGeral
		print("Escrevendo data %s"%(contReg[0]))		
		writer2.writerow((contGeral, contReg[0], labelData))
		print("Data %s escrita"%(contReg[0]))		
		#escreve relacionamento entre sensor e data
		print("Escrevendo relacionamento entre sensor %d e data %s"%(contSensor[0],contReg[0]))
		writer5.writerow((contSensorFlag,contData, labelEM))
		print("Relacionamento entre sensor %d e data %s escrito"%(contSensor[0],contReg[0]))
		contGeral += 1
		for contReg3 in records3:
			c2.execute("SELECT precipitacaoh FROM historico WHERE gidgeo_fk = %d AND datah = '%s' AND horah = %d"%(contSensor[0],contReg[0],contReg3[0]))
			records2 = c2.fetchall() 
			contHora = contGeral
			print("Escrevendo hora %d"%(contReg3[0]))				
			writer3.writerow((contGeral, contReg3[0], labelHora))
			print("Hora %d escrita"%(contReg3[0]))
			contGeral += 1
			#escreve relacionamento entre data e hora
			print("Escrevendo relacionamento entre data %s e hora %d"%(contReg[0],contReg3[0]))
			writer5.writerow((contData,contHora, labelAS))
			print("Relacionamento entre data %s e hora %d escrito"%(contReg[0],contReg3[0]))
			for contReg2 in records2:
				contPrecip = contGeral
				print("Escrevendo precipitacao %s"%(contReg2[0]))
				writer4.writerow((contGeral,contReg2[0], labelPrecip))
				print("Precipitacao %s escrita"%(contReg2[0]))				
				#escreve relacionamento entre hora e precipitacao
				print("Escrevendo relacionamento entre hora %d e precipitacao %s"%(contReg3[0],contReg2[0]))
				writer5.writerow((contHora,contPrecip, labelREGISTROU))
				print("Relacionamento entre hora %d e precipitacao %s escrito"%(contReg3[0],contReg2[0]))
				contGeral += 1
			
csv_sensor.close()
csv_data.close()
csv_hora.close()
csv_precipitacao.close()
csv_rels.close()
print(open('sensor.csv', 'rt').read())	

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por LuizH.M
      from urllib.request import urlopen   response = urlopen("http://vimeo.com/api/v2/video/57733101.json").read().decode('utf8') dados = json.loads(response)[0] print(dados)   print('Titulo: ',dados['title']) print('URL: ',dados['url']) print('Duração',dados['duration'])     a parte do json fala que não está definida   me ajudem pls    estou usando o visual studio
       
    • Por ckcesar
      Eu tenho uma aplicação no zend com a versão 5.6 e com o postgresql 9.6. Agora eu precisei mudar a versão do meu postgresql para o 16.1, a parte de conexão do bd e consultas sqls funciona perfeitamente, o meu problema está para acessar os meus controllers. Eles não são encontrados em nenhuma rota, quero ver se alguém já passou por esse problema para me ajudar. Obrigado.
    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por Marcosvn
      Quero desenvolver um site semelhante a esse: https://www.catalogosofertas.com.br/ 
       
      No qual eles enviam diversas ofertas e encartes recentes de lojas em geral e supermercados. Eles possuem muito conteúdo que são atualizados frequentemente, no entanto, muitos dos supermercados, por exemplo, não possuem os folhetos de cada cidade em seus sites. De modo que pudesse criar um scraper pra ficar acompanhando as atualizações. 
       
      Ao mesmo tempo não imagino que eles tenha muitos funcionários fazendo isso, pois são muitas lojas e supermercados que o encarte vence em alguns dias. Oq me faz pensar que manualmente é inviável manter as atualizações.
       
      Queria saber de vocês, que tem experiência com a área ou mesmo que já tenham trabalhado em projetos semelhantes, como posso me organizar para fazer isso acontecer assim como no site de exemplo: https://www.catalogosofertas.com.br/ 
       
      Como posso fazer isso ? Realmente teria q ficar criando diversos scraper e códigos pra ficar acompanhando os encartes de cada loja e supermercado?
       
      Qual dica, sugestão , orientação poderá me ser muito útil, pois estou confuso sobre como fazer isso acontecer.
×

Informação importante

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