使用Django ORM处理大量的大型记录
我有一个包含大约30k条记录的表,我试图迭代并使用Django的ORM进行处理。 每个记录存储几个二进制blob,每个二进制blob的大小都可以是几MB,我需要处理并写入一个文件。
但是,由于内存限制,我在使用Django时遇到了麻烦。 我的系统上有8GB的内存,但是在处理大约5K条记录后,Python进程占用了全部8GB,并被Linux内核杀死。 我已经尝试过各种技巧来清除Django的查询缓存,如:
MyModel.objects.update()
settings.DEBUG=False
gc.collect()
调用Python的垃圾回收器 然而,这些似乎都没有任何明显的影响,并且我的过程继续经历某种内存泄漏,直到它崩溃。
还有什么我可以做的吗?
由于我只需要一次处理一条记录,而且我不需要再次访问同一个记录,所以我不需要保存任何模型实例,也不需要一次加载多个实例。 你如何确保只有一个记录是加载和Django的缓存,并没有使用后立即unallocates所有的记忆?
尝试使用迭代器。
QuerySet通常会在内部缓存其结果,以便重复的评估不会导致其他查询。 相比之下,iterator()将直接读取结果,而无需在QuerySet级别进行任何缓存(内部默认迭代器调用iterator()并缓存返回值)。 对于返回大量只需要访问一次的对象的QuerySet,这可以实现更好的性能并显着减少内存。
这是来自django文档的引用:https://docs.djangoproject.com/en/dev/ref/models/querysets/#iterator
链接地址: http://www.djcxy.com/p/60205.html上一篇: Using Django ORM for processing huge numbers of large records