Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个Python(Django)代码会占用内存?_Python_Django - Fatal编程技术网

为什么这个Python(Django)代码会占用内存?

为什么这个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

为什么这个代码会消耗内存?当我运行它时,每次循环都会慢慢消耗更多的内存,我有大约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:
            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我与我的数据库没有关系没有外键。这就是为什么我要为我需要的每一个模型制作实例。你说得对。我改了密码。现在我正在学习如何使用日志记录。