Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单查询导致Django内存泄漏_Python_Django_Memory Leaks - Fatal编程技术网

Python 简单查询导致Django内存泄漏

Python 简单查询导致Django内存泄漏,python,django,memory-leaks,Python,Django,Memory Leaks,我在一家拥有大型数据库的公司工作,我想对其执行一些更新查询,但这似乎会导致巨大的内存泄漏 查询如下 c=CallLog.objects.all() 对于c中的i: i、 cdate=pytz.utc.localize(datetime.datetime.strtime(i.fixed_date,“%y-%m-%d%H:%m”)) i、 保存() 我是在Django的交互式shell中写的 我甚至试着用 with transaction.atomic() 但是它不起作用,你知道我怎样才能检测出

我在一家拥有大型数据库的公司工作,我想对其执行一些更新查询,但这似乎会导致巨大的内存泄漏 查询如下

c=CallLog.objects.all()
对于c中的i:
i、 cdate=pytz.utc.localize(datetime.datetime.strtime(i.fixed_date,“%y-%m-%d%H:%m”))
i、 保存()
我是在Django的交互式shell中写的

我甚至试着用

with transaction.atomic()
但是它不起作用,你知道我怎样才能检测出病毒的来源吗

我正在处理的数据集大约有2700万


fixed_date是一个计算属性

您可以尝试以下方法:

from django.core.paginator import Paginator

p = Paginator(CallLog.objects.all().only('cdate'), 2000)
for page in range(1, p.num_pages + 1):
    for i in p.page(page).object_list:
        i.cdate = pytz.utc.localize(datetime.datetime.strptime(i.fixed_date, "%y-%m-%d %H:%M"))
        i.save()


切片查询集不会加载内存中的所有对象,只是为了获得子集,而是在命中数据库之前为SQL查询添加限制和偏移量。

您可以尝试批量迭代查询集;参见方法。看看这是否有什么改进

for obj in CallLog.objects.all():
    obj.cdate = pytz.utc.localize(
        datetime.datetime.strptime(obj.fixed_date, "%y-%m-%d %H:%M"))
    obj.save()

这是我找到的一个亲戚,但已经有几年了

尝试将其分成小块(因为您只有4gb的ram)


必要时,我通常使用字符或数字(ID为1、2、3、4等)

为什么说这是内存泄漏?运行此代码时发生了什么?您可以添加任何错误stacktrace吗?我有一台4 gb内存机器,当我运行htop时,我看到所有内存都被Django占用,系统冻结,然后您需要使用Redis或某种队列处理程序逐个处理所有数据。我想这段代码会用相同的值更新整个表,我想用计算出的固定日期值更新每个记录。我考虑过F()表达式,但它不适用于计算properties@AhmedIbrahim我编辑了我的答案。试试这个,效果会好一点。如果这需要很长时间并且占用内存,您应该考虑创建一个异步任务,并让用户知道任务何时完成。我将尝试此任务,然后返回给您。它工作得很好,但速度很慢,但这并不重要,因为我只做了一次
c= CallLog.objects.filter(somefield=somevalue)