我有一个包含大约30k记录的表,我正在尝试迭代并使用Django的ORM进行处理。每条记录都存储了几个二进制blob,每个blob可以是几MB,我需要处理和写入文件。
但是,由于内存限制,我在使用Django时遇到了麻烦。我的系统上有8GB的内存,但在处理了大约5k的记录之后,Python进程消耗了所有8GB内存并被Linux内核杀死。我已经尝试了各种技巧来清除Django的查询缓存,例如:
MyModel.objects.update()
settings.DEBUG=False
gc.collect()
然而,这些似乎没有任何明显的影响,我的过程继续遇到某种内存泄漏,直到它崩溃。
我还能做些什么吗?
由于我只需要一次处理一个记录,并且我从不需要在进程中再次访问同一记录,所以我不需要保存任何模型实例,或者一次加载多个实例。你如何确保只加载一条记录,并且Django缓存没有并在使用后立即取消分配所有内存?
答案 0 :(得分:8)
尝试使用迭代器。
QuerySet通常在内部缓存其结果,以便重复 评估不会导致其他查询。相反, iterator()将直接读取结果,而不进行任何缓存 QuerySet级别(内部,默认迭代器调用iterator() 并缓存返回值)。对于返回大的QuerySet 您只需要访问一次的对象数量,这可能会导致 提高性能并显着降低记忆力。
来自django docs的引用:https://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator