Оптимизация миграции данных на юг для огромного количества объектов

Я работаю над проектом django, где мне нужны отношения OneToOne в обратном направлении. Раньше был OneToOneFieldphoto в MediaFile указывая на модель Photo, Я хочу заменить его на новый OneToOneFieldmediafileobject указывая назад от 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()

Надеюсь, это поможет.

Другие вопросы по тегам