在大型django表上进行高效的数据迁移

Leo*_*opd 7 python django performance django-models django-south

我需要在一个大的(5米行)django表中添加一个新列.我有一个南方schemamigration创建了新专栏.现在我正在编写一个datamigration脚本来填充新列.看起来像这样.(如果您不熟悉南迁移,只需忽略orm.模型名称的前缀.)

print "Migrating %s articles." % orm.Article.objects.count()
cnt = 0
for article in orm.Article.objects.iterator():            
    if cnt % 500 == 0:
        print "    %s done so far" % cnt
    # article.newfield = calculate_newfield(article)
    article.save()
    cnt += 1
Run Code Online (Sandbox Code Playgroud)

我从切换objects.all,以objects.iterator减少内存的需要.但是当我运行这个脚本时,某些东西仍在咀嚼着巨大的内存.即使上面注释了实际有用的行,脚本仍然会增长到使用10 GB以上的ram,然后才能在表格中走得很远而且我放弃了它.

好像在内存中持有某些东西.我该如何运行它,这不是记忆猪?

FWIW,我使用的是python 2.6,django 1.2.1,南0.7.2,mysql 5.1.

Ste*_*e K 7

确保settings.DEBUG设置为False.DEBUG=True特别是在数据库密集型操作中填充内存,因为它存储了在视图中发送到RDBMS的所有查询.

使用Django 1.8时,它不应该是必需的,因为现在存储了9000个硬编码的最大查询,而不是之前的无限数.