繁体   English   中英

在200k行MySQL数据库上计算成对比较的最快方法

[英]Fastest way to calculate pairwise comparison on 200k row MySQL database

我在MySQL数据库中存储了20万个列表。 给定一个列表A,我需要计算A与200k列表中每个列表X之间的相似度得分。 假设相似性度量很简单,例如A和X的交集的长度。

考虑到成对比较的本质,我想不出一种方法可以对此进行O(N)改进,因此,改善运行时意味着要使用多个CPU内核。 现在,我使用multithreading.Pool()将任务划分为4个核心,但仍需要近10分钟才能完成。 更糟糕的是,我的计算机已关闭以保护自己。

对于以前处理过此问题的任何人,您是否可以共享一种替代方法?

def bestmatch(A, lists):
     a = set(A)
     return min(lists, key=lambda x:  len(set(x) & a)

使用min可以循环C速度。 lambda一个快速引用闭包。 set(A)步骤仅计算一次,而不是在内循环中计算。

假设您的清单表格看起来像这样

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM