當(dāng)使用django ORM時(shí),如果要對(duì)某個(gè)模型的所有數(shù)據(jù)庫行操作時(shí),即調(diào)用all()方法時(shí),返回的數(shù)據(jù)行數(shù)太多,就會(huì)占用大量?jī)?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垃圾回收