【问题标题】:Optimize a South data migration for a huge number of objects针对大量对象优化 South 数据迁移
【发布时间】:2014-03-19 19:13:28
【问题描述】:

我正在开发一个 django 项目,我需要反向的 OneToOne 关系。以前,MediaFile 中有 OneToOneField photo 指向模型 Photo。我想用从Photo 指向MediaFile 的新OneToOneField mediafileobject 替换它。 (原因是照片模型在未来将变得不重要,我们希望在MediaFile admin 中为Photo 模型提供内联管理员。)

当我运行数据迁移以将旧关系复制到新关系时,一分钟后会出现一个

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。架构迁移已完成。

【问题讨论】:

    标签: django django-south data-migration


    【解决方案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()
    

    希望对您有所帮助。

    【讨论】:

    • 您的代码并没有直接解决我的问题,而是产生了一条不同的错误消息,帮助我找到了错误的根源:照片类的保存方法中的东西。使用update()绕过save()终于解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多