Django中的迭代和内存问题

时间:2013-06-05 13:33:42

标签: python django

我需要创建一对主题标签,以便人们可以判断这两个标签是否引用相同的内容。问题是有很多主题标签,而且我在Dreamhost VPS上运行代码,所以我的记忆力有限。

这是我的相关模型:

class Hashtag(models.Model):
    text = models.CharField(max_length=140)
    competitors = models.ManyToManyField('Hashtag', through='Competitors')
    tweet = models.ManyToManyField('Tweet')

    def __unicode__(self):
        return unicode_escape(self.text)

class Competitors(models.Model):
    tag1 = models.ForeignKey('Hashtag', related_name='+')
    tag2 = models.ForeignKey('Hashtag', related_name='+')
    yes = models.PositiveIntegerField(default=0, null=False)
    no = models.PositiveIntegerField(default=0, null=False)
    objects = models.Manager()

def __unicode__(self):
    return u'{0} vs {1}'.format(unicode_escape(self.tag1.text), unicode_escape(self.tag2.text))

这是我开发的用于创建竞争对手对象并将其保存到我的数据库的代码:

class Twitterator(object):
    def __init__(self, infile=None, outfile=None, verbosity=True):
    ...
        self.competitors_i = 1
    ...

    def __save_comps__(self,tag1, tag2):
        try:
            comps = Competitors(id=self.competitors_i,
                                tag1=tag1,
                                tag2=tag2,
                                yes=0,
                                no=0)
            comps.save()
        except IntegrityError:
            self.competitors_i += 1
            self.save_comps(tag1, tag2)
        else:
            self.competitors_i += 1

    def competitors_to_db(self, start=1):
        tags = Hashtag.objects.all()
        i = start
        while True:
            try:
                tag1 = tags.get(pk=i)
                j = i + 1
                while True:
                    try:
                        tag2 = tags.get(pk=j)
                        self.__save_comps__(tag1, tag2)
                        j += 1
                    except Hashtag.DoesNotExist:
                        break
                i += 1
            except Hashtag.DoesNotExist:
                break

这一切都“有效”,但在我耗尽内存并且整个事情被杀之前,我从未设法做到那么远。我认为使用.get会减少内存密集,但它似乎没有足够的内存密集度。我的印象是Django Querysets已经是迭代器了,所以我通常的'make a iterator'技巧就出来了。有关进一步减少内存占用的建议吗?

1 个答案:

答案 0 :(得分:1)

我认为问题出在这个函数中,i没有正确递增,你将继续循环i的相同值。

def competitors_to_db(self, start=1):
        tags = Hashtag.objects.all()
        i = start
        while True:
            try:
                tag1 = tags.get(pk=i)
                j = i + 1
                while True:
                    try:
                        tag2 = tags.get(pk=j)
                        self.__save_comps__(tag1, tag2)
                        j += 1
                    except Hashtag.DoesNotExist:
                        break  #<------move this after i +=1 otherwise i will not increment 
                        i += 1