我有大量需要分析的128位无符号整数(大约一万亿!)。
我对128位整数进行的研究使我有点盲目,numpy似乎并不完全支持它们,并且内部排序功能占用大量内存(使用列表)。
我想做的就是将例如十亿个128位无符号整数装入内存(如果只是二进制数据,则为16GB)并对其进行排序。有问题的机器具有48GB的RAM,因此可以使用32GB进行操作。如果必须以较小的块来完成,那么可以,但是尽可能多地执行较大的块会更好。 Python是否有一种排序算法,可以在不需要大量开销的情况下获取此类数据?
我可以使用.sort方法对列表进行128位整数排序,并且可以工作,但是不能缩放到我需要的水平。我确实有一个自定义编写的C ++版本,可以做到这一点,并且运行起来非常快,但是我想在Python中复制它以缩短开发时间(而且我没有写C ++,而且我不习惯这种语言)
很抱歉,如果您需要更多信息来描述问题,请提出任何问题。
答案 0 :(得分:0)
NumPy不支持128位整数,但是如果您使用由高位和低位无符号64位块组成的结构化dtype,则它们将以与128位整数相同的顺序排序:
arr.sort(order=['high', 'low'])
关于如何获取具有该dtype的数组,这首先取决于您如何加载数据。我想这可能涉及调用ndarray.view
来重新解释另一个数组的字节。例如,如果您有一个dtype uint8数组,该数组的字节应解释为小端128位无符号整数,那么在小端计算机上:
arr_structured = arr_uint8.view([('low', 'uint64'), ('high', 'uint64')])
所以对于十亿个整数来说这可能是合理的,但是您说您有大约一万亿个。这远远超出了48GB RAM计算机上的内存排序功能。您并没有要求立即处理整个万亿元素数据集的任何内容,因此希望您已经有了一个很好的解决方案,用于合并排序的数据块或对数据集进行预分区。
答案 1 :(得分:0)
我可能对Python期望过高,但是我并不失望。几分钟的编码使我得以创建出一些东西(使用内置列表),这些东西可以在几分钟内处理对8GB笔记本电脑上的亿个uint128项目进行排序的过程。
考虑到要排序的大量项目(1万亿个),很明显,在创建时将它们放入较小的bin /文件中比查找内存中的大量数字更有意义。通过将数据附加到以1MB块为单位的数千个文件中(旋转磁盘上的碎片)而产生的潜在问题,由于对这些碎片文件中的每个碎片进行排序而创建了将被读取多次的顺序文件(碎片文件为写一次,读一次)。
Python的开发速度所带来的好处似乎超过了对C / C ++的性能影响,特别是因为排序仅发生一次。