有什么方法可以使用GNU Coreutils排序,将64位数字存储在二进制文件中吗?若文件不是二进制的,那个么sort -n
就是解决方案,但我并没有找到任何将其用于二进制数据的选项。
文件相当大(约100GB),如果可能的话,我不想复制它的"文本"(非二进制)副本。
数据示例:
$ xxd file
00292e0: 4036 1eb7 6888 d319 de6b 7402 9ca9 f116 @6..h....kt.....
00292f0: db68 7f05 199f 9d36 cf01 cb28 e49f 1116 .h.....6...(....
0029300: 0c7c 8b55 2963 ef0c 277a f2b0 38d7 2b19 .|.U)c..'z..8.+.
0029310: c83b 2614 4327 d838 820c 1bb8 444f 1731 .;&.C'.8....DO.1
0029320: 1695 cab3 cd12 092a 0691 d7e4 5fcc b01d .......*...._...
0029330: b12b 7c1b a209 7c1c 568a 125c 541c d334 .+|...|.V..T..4
0029340: 09a3 ecbc 8370 e205 9265 7759 a378 4e2f .....p...ewY.xN/
bsort实用程序可以做到这一点。
这是一种用C编写的闪电般快速的就地基数排序。它开发的一个测试用例是在一台带有16Gb ram的机器上创建一个100Gb文件,大约需要22秒左右的时间进行排序。
sort(1)
在这里对您没有帮助。对于一个小文件,可以将文件拆分为多行并将其提供给sort(1)
,但对于100G文件来说当然不行。
Serverfault上这个问题的答案有一个为准确解决您的任务而编写的工具链接。你可以在那里检查github项目(它似乎是用Go编写的,所以如果你决定使用它,你需要安装一个编译器)。
快速谷歌搜索没有找到任何其他流行的工具来完成这项用更流行的语言编写的任务(这让我有点惊讶,因为这项任务本身只是一种合并类型,每年都有数千名学生在CS课程中实施,但这是一个偏离主题的问题)。