我有一个大约10毫米哈希的数据集。我需要允许人们将哈希列表与这些哈希列表进行比较,看看它们是否匹配。现在我们使用sql并基本扫描猜测数组中的每个项目。这适用于大约10K,但用户需要检查更大的设置,类似200K哈希与10mm哈希的字典
在sql或nosql或其他
中,这可能是一个很好的方法-
对于意图的上下文,我们管理一个选择退出列表,并允许营销经理上传一张表格,然后我们返回一个干净的nomail文件。
答案 0 :(得分:1)
如果您可以在表格中提供搜索值,则EXCEPT查询可能是您最好的选择。这将获得表2(搜索值)中不在表2中的所有条目(选择退出列表)。有关例外情况,请参阅我的帖子:http://sqlity.net/en/1401/a-join-a-day-except/
如果这不是一个选项,因为搜索值不在数据库中,请创建一个包含所有1000万个哈希值的内存驻留哈希表,并使用它来确定给定的电子邮件是否是列表的一部分。即使您必须为每个批次重新构建该表,它也会比向数据库发送200k请求更快。
答案 1 :(得分:0)
看起来当前的解决方案无法扩展, 即添加更多内存,cpus等以保持响应 用户不再需要的解决方案 由于系统负载增加。
维持响应能力的一种方法是实现一个 可扩展的可扩展解决方案,即分发 多个系统的工作量。
E.g。如果你有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;
}
系统上的本地副本必须保持一致 当进行任何更改,例如添加/删除时。