我有一个包含大约 30k 记录的表,我正在尝试使用 Django 的 ORM 对其进行迭代和处理。每条记录存储几个二进制 blob,每个二进制 blob 的大小可以是几 MB,我需要对其进行处理并将其写入文件。
然而,由于内存限制,我在使用 Django 时遇到了麻烦。我的系统有 8GB 内存,但在处理大约 5k 条记录后,Python 进程消耗了所有 8GB 内存并被 Linux 内核杀死。我尝试了各种清除 Django 查询缓存的技巧,例如:
- 定期调用
MyModel.objects.update()
- setting
settings.DEBUG=False
- 定期调用 Python 的垃圾收集器
gc.collect()
然而,这些似乎都没有任何明显的效果,并且我的进程继续经历某种内存泄漏,直到崩溃。
我还有什么可以做的吗?
由于我一次只需要处理每条记录,并且在此过程中我永远不需要再次访问同一条记录,因此我不需要保存任何模型实例,也不需要一次加载多个实例。如何确保只加载一条记录并且 Django 缓存nothing并在使用后立即取消分配所有内存?
尝试使用迭代器。
QuerySet 通常会在内部缓存其结果,以便重复
评估不会导致额外的查询。相比之下,
iterator() 将直接读取结果,而不做任何缓存
QuerySet 级别(在内部,默认迭代器调用 iterator()
并缓存返回值)。对于返回较大值的 QuerySet
您只需要访问一次的对象数量,这可能会导致
更好的性能和显着减少的内存。
这是 django 文档中的引用:https://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)