1

我想唯一一个由n 个元素组成的数组。

n可以达到 10^9,甚至 10^11。

也就是说,元素可能并不都适合内存。所以下面的简单排序唯一方法将不起作用(太慢:排序和唯一一个 10^8 数组需要半分钟一个线程)。

sort( a.begin(), a.end() ); a.erase( unique(a.begin(), a.end() ), a.end() );

幸运的是,设计算法有一些帮助:

  • 元素适合 64 位无符号整数 (uint64_t)。由于元素是由哈希函数生成的,所以我们可以假设它满足均匀分布( ~U(0, 2^64-1) )。

  • 我有一个不少于 10 台多核计算机/节点的集群,所以算法可以(并且应该)设计为分布式的。我有权运行 MPI C++ 代码。(但是集群不属于自己,有时可能有其他程序在任意一台计算机/节点上争抢CPU时间,所以任务最好动态分派到每台计算机/节点上)

  • 每台计算机/节点不少于8个核心,不少于64G主存,不少于100G SSD可用空间。此外,它们通过千兆以太网连接。

任何人都可以帮助就设计算法提出任何建议吗?该方法需要多次运行。我希望在一小时内在集群上得到结果。

4

2 回答 2

1

您还可以查看此 SO answer 中给出的有关并行排序算法的参考资料,以获得一些灵感 :-)

于 2013-09-20T12:35:07.397 回答
1

将您的数据分成两部分。假设一个部分很容易放入内存中。排序并使每个部分都独一无二。将其保存到文件中(可以同时完成)。就像合并两个排序集一样,您只需要每个部分的头部。处理过的元素可以写入磁盘。

从 2 到 N 部分的泛化很容易。

于 2013-09-20T12:20:12.483 回答