在20万行MySQL数据库中计算成对比较的最快方法
我在一个MySQL数据库里存了20万个列表。现在,我有一个列表A,我需要计算这个列表A和这20万个列表中每一个列表X的相似度分数。假设我们用的相似度计算方法很简单,比如看A和X中有多少个相同的元素。
因为是逐对比较,我想不出有什么办法能让这个过程比O(N)更快,所以要提高运行速度就得利用多个CPU核心。目前我把这个任务分配到4个核心上,用的是多线程池,但即便如此,完成这个任务还是要将近10分钟。更糟糕的是,我的电脑为了保护自己会自动关机。
如果你之前遇到过类似的问题,有没有什么其他的方法可以分享一下?
2 个回答
0
假设你的列表表格看起来像这样:
LISTID LISTITEM
1 1
1 2
1 3
2 2
2 4
2 5
如果列表 A 比如是 [1,2]
,你可以用 SQL 这样来操作:
SELECT LISTID, COUNT(*)
FROM T
WHERE LISTITEM IN (1,2)
GROUP BY LISTID
0
def bestmatch(A, lists):
a = set(A)
return min(lists, key=lambda x: len(set(x) & a)
使用 min 可以让循环的速度达到C语言的水平。lambda 是一种闭包,它可以快速引用 a。而 set(A)
这一步只计算一次,而不是在内层循环中重复计算。