如何在使用`delete()`时防止django加载内存中的对象?

我有内存问题,因为它看起来像Django使用delete()时将对象加载到内存中。 有没有办法阻止Django做到这一点?

从Django文档:

Django需要将对象提取到内存中以发送信号并处理级联。 但是,如果没有级联和没有信号,那么Django可能会采用快速路径并删除对象而不会将其提取到内存中。 对于大量删除,这可能会导致显着减少的内存使用量。 执行的查询量也可以减少。

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#delete

我不使用信号。 我在我试图删除的模型上有外键,但我不明白为什么Django需要将对象加载到内存中。 它看起来像它,因为我的记忆在查询运行时上升。


你可以使用像这样的函数遍历大量的对象而不用太多的内存:

import gc

def queryset_iterator(qs, batchsize = 500, gc_collect = True):
    iterator = qs.values_list('pk', flat=True).order_by('pk').distinct().iterator()
    eof = False
    while not eof:
        primary_key_buffer = []
        try:
            while len(primary_key_buffer) < batchsize:
                primary_key_buffer.append(iterator.next())
        except StopIteration:
            eof = True
        for obj in qs.filter(pk__in=primary_key_buffer).order_by('pk').iterator():
            yield obj
        if gc_collect:
            gc.collect()

然后,您可以使用该函数遍历要删除的对象:

for obj in queryset_iterator(HugeQueryset.objects.all()):
    obj.delete()

欲了解更多信息,你可以查看这篇博文。


你可以导入django数据库连接,并用sql将其删除。 我有和你一样的问题,这对我有很大的帮助。 这里有一些片段(我使用的是mysql,但你可以运行任何sql语句):

from django.db import connection
sql_query = "DELETE FROM usage WHERE date < '%s' ORDER BY date" % date
cursor = connection.cursor()
try:
    cursor.execute(sql_query)
finally:
    c.close()

这应该只对该表执行删除操作,而不会影响任何模型关系。

链接地址: http://www.djcxy.com/p/27609.html

上一篇: How to prevent django from loading objects in memory when using `delete()`?

下一篇: difference in match due to the position of negative lookahead?