使用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

    下一篇: Django ORM & Unit of Work