Django bulk_upsert将查询保存到内存,从而导致内存错误

Django bulk_upsert将查询保存到内存,从而导致内存错误,django,postgresql,memory-leaks,out-of-memory,upsert,Django,Postgresql,Memory Leaks,Out Of Memory,Upsert,对于Django web服务器,我们的资源非常有限,这意味着我们必须小心使用内存量。我们的web服务器的一部分是使用芹菜和rabbitmq的crom作业,它将~130MB的csv文件解析到我们的postgres数据库中。csv文件保存到磁盘,然后使用python中的csv模块逐行读取。因为csv文件基本上是一个提要,所以我们使用django postgres extra的定制postgres管理器中的批量上传来上传数据并覆盖现有条目。最近我们开始遇到内存错误,最终发现它们是由Django引起的

对于Django web服务器,我们的资源非常有限,这意味着我们必须小心使用内存量。我们的web服务器的一部分是使用芹菜和rabbitmq的crom作业,它将~130MB的csv文件解析到我们的postgres数据库中。csv文件保存到磁盘,然后使用python中的csv模块逐行读取。因为csv文件基本上是一个提要,所以我们使用django postgres extra的定制postgres管理器中的批量上传来上传数据并覆盖现有条目。最近我们开始遇到内存错误,最终发现它们是由Django引起的

运行mem_top向我们显示Django正在存储大量upsert queriesINSERT。。。关于冲突,请不要在内存中包含它们的元数据。每次大容量插入15000行将增加python使用的40MB内存,当我们总共插入750.000行时,作业完成时将总共使用1GB内存。显然,Django不会在查询完成后从内存中释放查询。在没有upsert调用的情况下运行crom作业将导致最大内存使用量为80MB,芹菜的默认内存使用量为60MB

我们尝试运行gc.collect和django.db.reset_查询,但查询仍然存储在内存中。我们的调试设置设置为false,并且未设置CONN_MAX_AGE。目前,我们正在寻找解决此问题的线索,我们现在无法运行crom作业。你知道最后有什么办法来解决这个问题吗

有关我们服务器的更多元信息:

django==2.1.3
django-elasticsearch-dsl==0.5.1
elasticsearch-dsl==6.1.0
psycopg2-binary==2.7.5
gunicorn==19.9.0
celery==4.3.0
django-celery-beat==1.5.0
django-postgres-extra==1.22

提前非常感谢

今天我找到了解决我们问题的方法,所以我觉得很高兴与大家分享。事实证明,问题是Django和Sentry的组合,我们只在生产服务器上使用它们。Django将记录查询,然后Sentry将捕获此日志并出于某种原因将其保存在内存中。由于每个原始SQL查询约为40MB,因此占用了大量内存。目前,我们关闭了crom作业服务器上的Sentry,并正在寻找清除Sentry保存的日志的方法。

您是否尝试过将csv数据分批传递而不是一次全部传递到批量插入?我正在分批传递csv数据。如前所述,在升级数据之前,我将它们分为15000组进行批处理。问题是这些批处理查询保存在内存中,永远不会被释放。由于每个查询大约为40MB,因此当我们总共插入750.000行时,会导致内存错误,这相当于最终使用的大约1000MB内存。