1

我有一个大约 10 毫米散列的数据集。我需要允许人们将哈希列表与那些进行比较,以查看它们是否匹配。现在我们使用 sql 并基本上扫描它以查找猜测数组中的每个项目。这适用于大约 10K,但用户需要检查更大的集合,例如 200K 哈希与 10mm 哈希字典

在 sql 或 nosql 或其他中,这可能是一个好方法

--

对于意图的上下文,我们管理一个选择退出列表,并允许营销经理上传一张针对它的表格,我们返回一个干净且无邮件的文件。

4

2 回答 2

1

如果您可以在表中提供搜索值,则 EXCEPT 查询可能是您最好的选择。这将为您提供不在表 2(选择退出列表)中的表 1(搜索值)的所有条目。除了示例,请参阅我的帖子:http: //sqlity.net/en/1401/a-join-a-day-except/

如果由于搜索值不在数据库中而无法选择,请创建一个包含所有 1000 万个哈希值的内存驻留哈希表,并使用它来确定给定电子邮件是否是列表的一部分。即使您必须为每个批次重新构建该表,它也会比向数据库发送 200k 请求要快。

于 2012-12-21T22:45:55.687 回答
0

由于系统负载增加,当前的解决方案似乎无法扩展,即添加更多内存、cpu 等来维持用户所需的响应解决方案不再可能。

保持响应能力的一种方法是实施可扩展的可扩展解决方案,即跨多个系统分布工作负载。

例如,如果您可以有 10 个系统,每个系统在 nosql 中都有 1000 万哈希的本地副本,那么当请求检查 200K 哈希时,工作可能会分布在 10 个系统上,每个系统都处理检查 20K 哈希的请求.

这是经典的分而治之的方法。

伪代码类似于

while (1) {                   
    wait for a request to come in;

    for (j = 1; j < 10; j++) {
        spawn(system[j], 1/10 of the request for matching)
    }   

    wait for/collect responses from 10 systems

    return result;
}                 

当进行任何更改(例如添加/删除)时,系统上的本地副本必须保持一致。

于 2012-12-23T06:11:35.990 回答