當使用django ORM時辨液,如果要對某個模型的所有數(shù)據(jù)庫行操作時,即調(diào)用all()方法時箱残,返回的數(shù)據(jù)行數(shù)太多滔迈,就會占用大量內(nèi)存,導(dǎo)致問題被辑。
如果使用iterator燎悍,分塊來加載指定行數(shù)的數(shù)據(jù),就能有效減少內(nèi)存的占用盼理。
import gc
def querset_iterator(queryset, chucksize=10000):
pk = 0
last_pk = queryset.order_by('-pk')[0]
queryset.order_by('pk')
while pk < last_pk:
for row in queryset.filter(pk__gt=pk)[:chucksize]:
# 每次讀入內(nèi)存的行數(shù)最大為chucksize
yield row
pk = row.id
gc.collect()
# gc垃圾回收