如何在使用`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?