我在数据库中有 30,000 行需要进行相似性检查(使用 similar_text
或其他此类函数)。
为此,需要对每一列进行 30,000^2 次检查。
我估计我将平均检查 4 列。
这意味着我将不得不进行 3,600,000,000 次检查。
考虑到请求内存限制和时间限制等因素,使用 PHP 执行此操作的最佳(最快、最可靠)方法是什么?
在执行此操作的同时,服务器仍需要主动为网页提供服务。
附言。我们使用的服务器是 8 核 Xeon 32 GB 内存。
编辑:
每列的大小通常少于 50 个字符。
最佳答案
我猜你只需要全文搜索。
如果那不适合你,你只有一个机会来解决这个问题:缓存结果。 因此,您不必为每个请求解析 30 亿条记录
无论如何,你可以怎么做:
$result = array();
$sql = "SELECT * FROM TABLE";
while( $row = ... ) {
$result[] = $row; //> Append the current record
}
现在结果包含您表格中的所有行。
此时你说你想要similar_text()
所有列。
要做到这一点并缓存结果,您至少需要一个表(正如我在评论中所说)。
//> Starting calculating the similarity
foreach($result as $k=>$v) {
foreach($result as $k2=>$v2) {
//> At this point you have 2 rows, $v and $v2 containing your column
$similarity = 0;
$similartiy += levensthein($v['column1'],$v2['column1']);
$similartiy += levensthein($v['column2'],$v2['column2']);
//> What ever comparison you need here between columns
//> Now you can finally store the result by inserting in a table the $similarity
"INSERT DELAYED INTO similarity (value) VALUES ('$similarity')";
}
}
2 需要注意的事项:
我使用 levensthein 因为它比 similar_text 快得多(注意它的值与 similar_text 相反,因为 levensthein 的值越大返回字符串之间的亲和性越小)
我使用INSERT DELAYED大大降低了数据库成本
关于php - 大型数据库的高性能 PHP 相似性检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194262/