Джанго: как оптимизировать этот запрос на большой таблице - PullRequest
0 голосов
/ 20 августа 2011

Для контекста у меня много измерений температуры, проведенных на разных станциях, и я хочу проверить, соответствует ли это прогнозу. Моя модель:

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

Как я могу оптимизировать время выполнения? Есть ли способ сделать это с помощью одного запроса?

Спасибо!

1 Ответ

0 голосов
/ 22 августа 2011

Для каждого измерения вы пересчитываете среднее значение за последние 7 дней.Если ваши измерения ближе друг к другу, чем 7 дней, у вас будет дублирование.Например, если ваши измерения разнесены на 1 день, то вы пересчитываете среднее значение для каждого объекта 6 раз в базе данных, которая является МЕДЛЕННОЙ.

Лучше всего собрать все измерения, затем все прогнозы, которые соответствуют, а затем выполнитьУсреднение в памяти в Python.Конечно, больше кода на Python, но он будет работать быстрее.

...