0

我有大量的 128 位无符号整数需要排序以供分析(大约一万亿!)。

我对 128 位整数所做的研究让我走入了一条死胡同,numpy 似乎并不完全支持它们,而且内部排序功能是内存密集型的(使用列表)。

例如,我想做的是将十亿个 128 位无符号整数加载到内存中(如果只是二进制数据,则为 16GB)并对它们进行排序。有问题的机器有 48GB 的​​ RAM,所以应该可以使用 32GB 进行操作。如果必须在较小的块中完成,那没关系,但是尽可能大的块会更好。Python 是否有一种排序算法可以在不需要大量开销的情况下获取此类数据?

我可以使用列表的 .sort 方法对 128 位整数进行排序,它可以工作,但它无法扩展到我需要的级别。我确实有一个 C++ 版本,它是定制编写的,并且运行速度非常快,但我想在 Python 中复制它以加快开发时间(而且我没有编写 C++,而且我不习惯那种语言) .

抱歉,如果需要更多信息来描述问题,请提出任何问题。

4

2 回答 2

0

NumPy 不支持 128 位整数,但如果您使用由高位和低位无符号 64 位块组成的结构化 dtype,它们将按照与 128 位整数相同的顺序排序:

arr.sort(order=['high', 'low'])

至于如何获得具有该 dtype 的数组,这首先取决于您如何加载数据。我想它可能涉及调用ndarray.view以重新解释另一个数组的字节。例如,如果您有一个 dtype uint8 数组,其字节应解释为 little-endian 128 位无符号整数,则在 little-endian 机器上:

arr_structured = arr_uint8.view([('low', 'uint64'), ('high', 'uint64')])

所以这对于十亿个整数来说可能是合理的,但你说你有大约一万亿个整数。这比 48GB RAM 计算机上的内存排序要多得多。您还没有要求一次处理整个万亿元素数据集,所以我希望您已经有了一个好的解决方案来合并排序的块,或者对数据集进行预分区。

于 2018-10-21T23:40:32.667 回答
0

我可能对 Python 期望过高,但我并不失望。几分钟的编码让我创建了一些东西(使用内置列表),可以在几分钟内处理对 8GB 笔记本电脑上的一亿个 uint128 项目的排序。

考虑到要排序的大量项目(1 万亿),很明显,在创建时将它们放入较小的 bin/文件中比在内存中对大量数字进行排序更有意义。通过将数据附加到 1MB 块中的数千个文件(旋转磁盘上的碎片)所产生的潜在问题并不那么令人担忧,因为这些碎片文件中的每一个的排序创建了一个将被多次读取的顺序文件(碎片文件是写一次,读一次)。

Python 开发速度的优势似乎超过了与 C/C++ 相比对性能的影响,尤其是因为排序只发生一次。

于 2018-10-22T17:07:52.343 回答