使用Django ORM处理大量大型记录

时间:2012-11-09 16:22:22

标签: python django django-orm

我有一个包含大约30k记录的表,我正在尝试迭代并使用Django的ORM进行处理。每条记录都存储了几个二进制blob,每个blob可以是几MB,我需要处理和写入文件。

但是,由于内存限制,我在使用Django时遇到了麻烦。我的系统上有8GB的内存,但在处理了大约5k的记录之后,Python进程消耗了所有8GB内存并被Linux内核杀死。我已经尝试了各种技巧来清除Django的查询缓存,例如:

  1. 定期致电MyModel.objects.update()
  2. 设置settings.DEBUG=False
  3. 通过gc.collect()
  4. 定期调用Python的垃圾收集器

    然而,这些似乎没有任何明显的影响,我的过程继续遇到某种内存泄漏,直到它崩溃。

    我还能做些什么吗?

    由于我只需要一次处理一个记录,并且我从不需要在进程中再次访问同一记录,所以我不需要保存任何模型实例,或者一次加载多个实例。你如何确保只加载一条记录,并且Django缓存没有并在使用后立即取消分配所有内存?

1 个答案:

答案 0 :(得分:8)

尝试使用迭代器。

  

QuerySet通常在内部缓存其结果,以便重复   评估不会导致其他查询。相反,   iterator()将直接读取结果,而不进行任何缓存   QuerySet级别(内部,默认迭代器调用iterator()   并缓存返回值)。对于返回大的QuerySet   您只需要访问一次的对象数量,这可能会导致   提高性能并显着降低记忆力。

来自django docs的引用:https://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator