在Scala中合并大集(HashSet)

时间:2011-08-03 11:17:42

标签: scala collections scala-collections

我有两个巨大的(如数百万个条目)集合(HashSet),它们之间有一些(< 10%)重叠。我需要将它们合并为一组(我不关心维护原始集合)。

目前,我正在将一组中的所有项目添加到另一组:

setOne ++= setTwo

这需要几分钟才能完成(在成员调整hashCode()几次后)。

任何想法如何加快速度?

3 个答案:

答案 0 :(得分:5)

使用Scala 2.9.0 +中的Parallel Collections API可以获得更好的性能:

setOne.par ++ setTwo

(setOne.par /: setTwo)(_ + _)

答案 1 :(得分:2)

您可能想尝试一些事情:

  • 使用sizeHint方法将您的设置保持在预期的大小。
  • 在其上调用useSizeMap(true)以获得更好的哈希表调整大小。

在我看来,后一个选项可以提供更好的结果,尽管两者都显示了对测试的改进。

答案 2 :(得分:0)

你能告诉我一些关于集合内部数据的信息吗?我问的原因是,对于这种事情,你通常需要一些专门的东西。这里有一些可以做的事情:

  • 如果数据是(或可以)排序的,您可以使用指针进行合并,类似于使用合并排序所做的操作。此操作非常简单,因为您可以对一个数据集进行分区,然后使用二进制搜索对第二个数据集进行分区,以找到正确的边界。
  • 如果数据在某个数字范围内,您可以使用位集,只需在遇到该数字时设置位。
  • 如果其中一个数据集小于另一个数据集,您可以将其放入哈希集中并快速循环遍历其他数据集,检查包含。

我已经使用了第一个策略,在大约一秒钟内从大约4万个较小的集合中创建了一个大约800万个整数的巨大集合(在Scala上的强大硬件上)。