0

これが私のコードです:

def new_badge(badge_classes=None, users=None):
    """
    Utility function for awarding a badge when a new one is added.
    """

    badge_classes = get_badges_classes() if badge_classes is None else badge_classes
    total = users.count()

    for i, user in enumerate(users.iterator()):
        t0 = time.time()
        flight_ids = []
        for flight in user.flight_set.order_by('date').iterator():
            flight_ids.append(flight.id)
            flights_before = Flight.objects.filter(id__in=flight_ids)
            for BadgeClass in badge_classes:
                badge = BadgeClass(all_flights=flights_before, new_flight=flight)
                badge.grant_if_eligible()

        print "-- %s" % user.username
        print "-- %.2f s" % (time.time() - t0)
        print "-- %.2f%% done" %(float(i) / total * 100)

クエリセットには2700のオブジェクトがありusers、500,000を超えるフライトがあります。このスクリプトを実行すると、非常に長い時間がかかると思いますが、問題は、メモリをますます消費していることです。数時間後、スクリプトは次のエラーで停止します。

File "/Users/chris/Documents/flightloggin2/badges/models.py", line 361, in eligible
  c = countries.count()
File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 351, in count
  return self.query.get_count(using=self.db)
File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 418, in get_count
  number = obj.get_aggregation(using=using)[None]
File "/Library/Python/2.7/site-packages/django/contrib/gis/db/models/sql/query.py", line 85, in get_aggregation
  return super(GeoQuery, self).get_aggregation(using)
File "/Library/Python/2.7/site-packages/django/db/models/sql/query.py", line 384, in get_aggregation
  result = query.get_compiler(using).execute_sql(SINGLE)
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql
  cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/django/db/backends/util.py", line 40, in execute
  return self.cursor.execute(sql, params)
File "/Library/Python/2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
  return self.cursor.execute(query, args)

django.db.utils.DatabaseError: could not create temporary file "base/pgsql_tmp/pgsql_tmp98246.932828": No space left on device

どうすればこれを修正できますか?スクリプトを実行すると、スクリプトを実行しtopているpythonプロセスに10Gのメモリがあることを教えてくれたので、postgresではなくpython側の何かだと思いますが、完全にはわかりません。

4

0 に答える 0