如何处理Django的Queryset效率低下?

时间:2018-02-10 12:25:09

标签: python django database

我已经看到了其他问题,但不幸的是我还没有找到类似的问题。

信息的大小约等于1 GB,但是我迭代的对象数量非常大。 (虽然我无法找到它,但是在我执行len(model.objects.all())后,shell会在几分钟内被自动杀死。

考虑到只是通过尝试获取其长度来杀死进程(通过使用len函数,我也尝试了count()方法,但它似乎在某种程度上受到限制),我知道搜索通过对象可以忽略不计(尤其是利用相似度算法搜索它们)。

但我仍然尝试过,我已经使用Cosine similarity找出最佳匹配,这是搜索代码:

zsim = ("", 0)
for qst in Question.objects.all().iterator():
    sim = cosine_similarity(qst.question, string)
    if zenith_sim[1] > 0.75:
        break
    elif sim > zenith_sim[1]:
        zenith_sim = (qst.answer, sim)
return str(zenith_sim[0])

上面的代码搜索与用户的字符串最相似的字符串,但为了避免无关紧要的迭代,如果相似度高于75%,则会打破循环。我还使用了iterator()方法,希望能节省一些内存。

正如预期的那样,该过程在执行后几分钟被杀死。我不确定如何改进。机器本身并不慢,虽然它不能归类为超级计算机。

大型组织系统可以在几秒钟内通过100 + PB的信息执行相似性查询。

我想知道什么可以用来提高相似性查询的效率,搜索这些数据会导致Django杀死它自己的进程。有效查询的解决方案是什么?直接数据库搜索更有效率吗?

1 个答案:

答案 0 :(得分:1)

(请原谅我,如果我不能正确理解你想要做什么) 你试过这个来计算返回的数据吗?

model.objects.all().count()

另外,为什么不使用model.objects.filter()来限制重新获取的数据量呢?

也许您应该使用django debug toolbar来调试这些查询中的瓶颈。