我需要创建成对的主题标签,以便人们可以判断相关的两个标签是否指的是同一事物。问题是有很多主题标签,而且我在 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/