比较1000万个实体

时间:2013-02-28 12:04:31

标签: c# algorithm matching

我必须编写一个程序,将10'000'000个实体相互比较。这些实体基本上是数据库/ csv文件中的平行。

比较算法必须非常灵活,它基于规则引擎,最终用户输入规则,每个实体与其他实体匹配。

我正在考虑如何将此任务拆分为较小的工作负载,但我还没有找到任何东西。由于规则是由最终用户输入的,因此预先排序DataSet似乎是不可能的。

我现在要做的是将整个DataSet放在内存中并处理每个项目。但这不是很高效,需要大约。 20 GB内存(压缩)。

您是否知道如何分割工作量或减少工作量?

由于

5 个答案:

答案 0 :(得分:12)

如果您的规则属于最高抽象级别(例如任何未知的比较函数),则无法实现目标。 10 ^ 14比较操作将持续很长时间。

如果规则不完全通用,我会看到3种优化不同情况的解决方案:

  • 如果比较是传递的,你可以计算哈希(某人已经推荐了这个),就去做吧。哈希也可能很复杂,不仅仅是你的规则=)。找到好的哈希函数,在许多情况下它可能会有所帮助。

  • 如果实体可排序,请对其进行排序。为此,我建议不要就地排序,而是建立一个项目索引(或ID)数组。如果您的比较可以转换为SQL(我理解您的数据在数据库中),您可以更有效地在DBMS端执行此操作并读取已排序的索引(例如3,1,2,这意味着ID = 3的项目)是最低的,ID = 1在中间,ID = 2是最大的)。然后,您只需要比较相邻的元素。

  • 如果值得,我会尝试使用一些启发式排序或散列。我的意思是我会创建哈希,它不一定唯一地标识相等的元素,但可以将数据集分成组,在这些组之间肯定没有一对相等的元素。然后所有相等的对将在内部组中,您可以逐个读取组,并在不是10 000 000的组中进行手动复杂函数计算,但是例如100个元素。另一个子方法是具有相同目的的启发式排序,以保证相等元素不在数据集的不同结尾。之后,您可以逐个读取元素,并与之前的1000个元素进行比较(已经读取并保留在内存中)。我会留下记忆,例如1100个元素,每次新的100来时免费最老的100个。这将优化您的数据库读取。如果您的规则包含诸如(Attribute1 = Value1)AND(...)之类的规则,或者像(Attribute1< Value2)AND(...)之类的规则或任何其他简单规则,则也可以实现其他实现。然后,您可以通过此标准首先进行聚类,然后比较创建的聚类中的项目。

顺便说一下,如果你的规则认为所有10 000 000个元素相等,怎么办?你想获得10 ^ 14个结果对吗?这个案例证明在一般情况下你无法解决这个问题。尝试制定一些限制和假设。

答案 1 :(得分:4)

我会尝试考虑规则层次结构。 比方说,例如规则A是“颜色”而规则B是“形状”。

如果您先按颜色划分对象, 而不需要将红色圆圈与蓝色三角形进行比较。

这将减少您需要做的比较次数。

答案 2 :(得分:1)

我会从每个实体创建一个哈希码。您可能必须从哈希生成中排除id,然后测试equals。如果你有哈希,你可以按字母顺序排列所有哈希码。按顺序排列所有实体意味着检查双打非常容易。

答案 3 :(得分:1)

如果你想要将每个实体与所有实体进行比较而不是有效地你需要对数据进行聚类,那么比较完全不相关的东西的理由就少得多(比较衣服与人类没有意义),我认为你的规则会尝试聚集数据。

所以你需要对数据进行聚类,尝试一些像K-Means这样的聚类算法。

另见Apache Mahout

答案 4 :(得分:-1)

您是否正在寻找最合适的排序算法,对此类型? 我认为Divide和Concur似乎很好。 如果算法看起来不错,您可以通过其他方法进行计算。使用MPICH或其他东西进行特殊并行处理可能会为您提供最终目的地。

但在决定如何执行之前,你必须先考虑算法是否适合。