1

我需要创建成对的标签,这样人们就可以判断两个标签是否指的是同一件事。问题是有很多标签,而且我在 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 查询集已经是迭代器,所以我通常的“制作迭代器”技巧已经失效。有什么建议可以进一步减少我的内存占用吗?

4

1 回答 1

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
于 2013-06-05T13:41:21.767 回答