Jump to content

click.png

click.png

click.png

click.png

click.png

click.png

click.png click.png click.png

click.png

click.png

click.png

click.png

click.png

click.png

Pesquisa lenta em script com PostgreSQL


Jessica Marinho
  • Este tópico foi criado há 1750 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

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'\
	");


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())	

 

Link to comment
Share on other sites

  • Consultores

Você precisa verificar quais partes do seu código está precisando ser otimizada.

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Este tópico foi criado há 1750 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.