python - Django 中的迭代和内存问题

标签 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))

这是我开发的用于创建 Competitors 对象并将它们保存到我的数据库的代码:

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 查询集已经是迭代器了,所以我通常的“创建迭代器”技巧已经结束了。对于进一步减少内存占用有什么建议吗?

最佳答案

我认为问题出在这个函数中,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

关于python - Django 中的迭代和内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16941356/

相关文章:

python - scipy.stats.linregress - 获取截距的 p 值

python - 如何根据自定义概率密度函数(Python)生成随机数?

python - 设置 Virtualenv 和 Virtualenvwrapper 的问题

python - Django:将 View 中的日期时间设置为 utc+1

python - 在 QImage 上绘制矩形而不显示它

python - 当 django 管理员创建用户时,将用户详细信息发送到他的电子邮件

python - 使用 Django 从数据库中预填充 HTML 表单表

jquery - 需要一个简单的 django 表单工作 ajax 示例

python - DJango 包含不适用于 JSONField

python - numpy:为什么 (x,1) 和 (x, ) 维度之间存在差异