Оптимизация миграции данных на юг для огромного количества объектов
Я работаю над проектом django, где мне нужны отношения OneToOne в обратном направлении. Раньше был OneToOneField
photo
в MediaFile
указывая на модель Photo
, Я хочу заменить его на новый OneToOneField
mediafileobject
указывая назад от Photo
в MediaFile
, (Причина в том, что фотомодель в будущем станет неважной, и нам нужен встроенный админ для Photo
модель внутри MediaFile
админ.)
Когда я запускаю миграцию данных, чтобы скопировать старые отношения в новые, через минуту появляется
socket.error: [Errno 24] Too many open files
Единственная правдоподобная причина в том, что я оперирую слишком многими объектами (около 20000). Если затронуто только несколько сотен объектов, ошибка не появится. Вот код миграции, который я написал:
def forwards(self, orm):
mediafiles = MediaFile.objects.all()
for mediafile in mediafiles:
try:
mediafile.photo.mediafileobject = mediafile
except AttributeError:
pass # When mediafile.photo is None
else:
mediafile.photo.save()
Как я могу оптимизировать это? Я работаю с django1.3, South0.7.3 и MySQL. Миграция схемы уже выполнена.
1 ответ
Вы можете использовать Django Paginator, чтобы разбить набор запросов на страницы / куски:
paginator = Paginator(MediaFile.objects.all(), 10)
for i in xrange(1, paginator.num_pages):
for mediafile in paginator.page(i).object_list:
try:
mediafile.photo.mediafileobject = mediafile
except AttributeError:
pass # When mediafile.photo is None
else:
mediafile.photo.save()
Надеюсь, это поможет.