2011-08-20 4 views
0

컨텍스트를 제공하기 위해 여러 스테이션에서 많은 온도 측정을 수행했으며 예측 한 내용과 일치하는지 확인하려고합니다. 내 모델은 다음과 같습니다Django : 대형 테이블에서이 쿼리를 최적화하는 방법

각각의 온도 측정을 위해
class Station(models.Model): 
    station_id = models.CharField(max_length = 18 ,primary_key = True) 
    sector = models.CharField(max_length = 40) 

class Weather(models.Model): 
    station = models.ForeignKey(Station) 
    temperature = models.FloatField() 
    date = models.DateField() 

class Forecast(models.Model): 
    station = models.ForeignKey(Station) 
    date = models.DateField() 
    score = models.IntegerField() 

이 시간 프레임에서 다른 온도 측정이되는,이 없다면, 나는, 최근 7 일 동안 역의 예측 점수의 평균을 알고 싶습니다 시작점입니다. 다음 코드는 내가 원하는 것은 수행하지만 실행하기에는 너무 느립니다 (~ 10 분!) :

observations = Weather.objects.all().order_by('station','date') 
for obs in observations: 
    try : 
     if obs.station == previous.station: 
      date_inf = min(obs.date- timedelta(days=7), previous.date) 
     else : 
      date_inf = obs.date- timedelta(days=7) 
    except UnboundLocalError : 
     date_inf = obs.date- timedelta(days=7)  

    forecast = Forecast.objects.filter(
             station=obs.station 
          ).filter(
             date__gte = date_inf 
          ).filter(
             date__lte = obs.date - timedelta(days=1) 
          ).aggregate(average_score=Avg('score')) 


    if forecast["average_score"] is not None: 
     print(forecast["average_score"],obs.rating) 
     # Some more code.... 

    previous = obs 

어떻게 실행 시간을 최적화 할 수 있습니까? 단일 쿼리로이 작업을 수행 할 수 있습니까?

감사합니다.

답변

0

측정 할 때마다 지난 7 일간의 평균을 다시 계산합니다. 측정 값이 7 일보다 가까워지면 겹치는 부분이 생깁니다. 예 : 당신의 측정치가 1 일 간격으로 떨어져 있다면, 각 객체에 대한 평균을 천천히 데이터베이스에서 6 번 다시 계산합니다.

가장 좋은 방법은 모든 측정치를 가져온 다음 일치하는 모든 예측치를 얻은 다음 파이썬에서 메모리로 평균화하는 것입니다. 물론 더 많은 파이썬 코드가 있지만 더 빨리 실행됩니다.

관련 문제