为什么这个Python(Django)代码会占用内存?
为什么这个代码会消耗内存?当我运行它时,每次循环都会慢慢消耗更多的内存,我有大约300000个循环。我正在使用Windows和Python 2.6为什么这个Python(Django)代码会占用内存?,python,django,Python,Django,为什么这个代码会消耗内存?当我运行它时,每次循环都会慢慢消耗更多的内存,我有大约300000个循环。我正在使用Windows和Python 2.6 def LoadVotes(self): old_votes=Votes.objects.all() amount=old_votes.count() print 'Amount of votes is: ' + str(amount) c=0 for row in old_votes: try
def LoadVotes(self):
old_votes=Votes.objects.all()
amount=old_votes.count()
print 'Amount of votes is: ' + str(amount)
c=0
for row in old_votes:
try:
new_id_user=LegacyUserId.objects.get(legacy_id=row._login)
except LegacyUserId.DoesNotExist:
string=" user with old id "+str(row._login)+" does not match new user id /n"
log=open('log_add_old_votes.txt','a')
log.write(string)
continue
try:
new_id_media=LegacyMedia.objects.get(legacy_id=row.media_file_id)
except new_id_media.DoesNotExist:
log_text='old media with ID:'+str(row.media_file_id)+' is not found in relation with new media \n'
log=open('log_add_old_votes.txt','a')
log.write(log_text)
continue
mo=MediaObject.objects.get(pk=new_id_media.object_id)
new_votes_item, created=Mark.objects.get_or_create(user=new_id_user.user, media_object=mo, defaults={'mark':int(row.rate)*2})
c=c+1
i=amount-c
print '\rRemain:',
stdout.write("%d" % i)
stdout.flush()
大概是因为它为数据库中的每个投票加载对象,然后遍历这些投票并为每个投票加载LegacyUserID,为每个投票加载LegacyMedia对象 如果您拥有的数据量很大,或者这些对象很大,这将占用大量内存
如果LegacyMedia本身就是一个相当大的对象,我也不会感到惊讶。你永远不会关闭你打开的文件。你应该这样做文件访问
with open('log_add_old_votes.txt','a') as log:
log.write(string)
一旦完成文件对象,它将自动为您关闭该文件对象。对于每个日志消息,您也使用相同的文件,因此您可以在循环之前移动open to并使用相同的file对象,直到完成为止。如果使用DEBUG=True运行,django会将所有查询存储在内存中。尝试在settings.py文件中更改为DEBUG=False。我不确定投票模型是什么样子。但是,您只感兴趣于投票、登录和MyAdiaFieleId的两个属性。因此,您可以考虑使用值或QueReSETAPI来代替,这样您只选择需要的字段,而不为每行创建对象。
还取决于您有多少选票,而不是LeCasyUsRID或LeaCyMeLeo行,如果您有一个外键,您可能只考虑通过一个连接直接选择那些行,而不是迭代投票,然后在ID存在时发出新的查询。
<>最后,这不会影响内存,但是考虑使用代替当前方法。或者至少在函数开始时打开一次文件,而不是每次需要写入时打开一次。从底部开始,一次删除一行,您可以使用二进制搜索bug来加快速度,直到问题消失。应该很容易找出哪些行占用了内存。是的,但每个循环都必须清除变量。相反,这是我的记忆。可能是因为我没有关闭日志文件,每次循环都会再次打开文件,并占用更多内存?我没有使用log.close我与我的数据库没有关系没有外键。这就是为什么我要为我需要的每一个模型制作实例。你说得对。我改了密码。现在我正在学习如何使用日志记录。