我已经看到了其他问题,但不幸的是我还没有找到类似的问题。
信息的大小约等于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杀死它自己的进程。有效查询的解决方案是什么?直接数据库搜索更有效率吗?
答案 0 :(得分:1)
(请原谅我,如果我不能正确理解你想要做什么) 你试过这个来计算返回的数据吗?
model.objects.all().count()
另外,为什么不使用model.objects.filter()来限制重新获取的数据量呢?
也许您应该使用django debug toolbar来调试这些查询中的瓶颈。