我想要一个 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可用空间。此外,它们通过千兆以太网连接。
有人可以帮忙提出有关设计算法的任何建议吗?该方法需要多次运行。我希望在群集上一小时得到结果。
答案 0 :(得分:1)
将数据拆分为两部分。假设一个部分很容易适合记忆。排序并使每个部分都独一无二。将其保存到文件中(可以同时完成)。就像合并两个有序集合一样,您只需要每个部分的头部。处理过的元素可以写入磁盘。
从2到N部分的推广很容易。
答案 1 :(得分:1)
您也可以查看给定in this SO answer的并行排序算法的参考资料,以获得灵感: - )