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

Cer*_*rin 4 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. 定期调用Python的垃圾收集器 gc.collect()

但是,这些似乎没有任何明显的效果,我的过程继续遇到某种内存泄漏,直到它崩溃.

还有什么我可以做的吗?

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

Pav*_*yak 8

尝试使用迭代器.

QuerySet通常在内部缓存其结果,以便重复的计算不会导致其他查询.相反,iterator()将直接读取结果,而不在QuerySet级别执行任何缓存(在内部,默认迭代器调用iterator()并缓存返回值).对于返回大量只需要访问一次的大量对象的QuerySet,这可以带来更好的性能并显着降低内存.

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