これが私のコードです:
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側の何かだと思いますが、完全にはわかりません。