我有一个 500GB 的文本文件,其中大约有 100 亿行需要按字母顺序排序。最好的算法是什么?我的实施和设置可以改进吗?
现在,我正在使用 coreutils 排序命令:
LANG=C
sort -k2,2 --field-separator=',' --buffer-size=(80% RAM) --temporary-directory=/volatile BigFile
我在 AWS EC2 的 120GB RAM 和 16 核虚拟机上运行它。这需要一天中的大部分时间。
/volatile 是一个 10TB RAID0 阵列。
'LANG=C' 技巧提供 x2 速度增益(感谢1)
默认情况下,“排序”使用 50% 的可用 RAM。提高到 80-90% 会有所改善。
我的理解是 gnu 'sort' 是 O(n log n) 的合并排序算法的变体,这是最快的:见2 & 3。转向 QuickSort 会有所帮助吗(我对不稳定的排序感到满意)?
我注意到的一件事是只使用了 8 个内核。这与 linux coreutils sort.c 中的 default_max_threads 设置为 8 有关(参见4)。用 16 重新编译 sort.c 会有所帮助吗?
谢谢!
跟进 :
@dariusz
我在下面使用了克里斯和你的建议。
由于数据已经分批生成:我分别对每个桶进行了排序(在几台不同的机器上),然后使用了“sort --merge”功能。像魅力一样工作并且速度更快:O(log N / K)与O(log N)。
我还从头开始重新考虑该项目:现在在生成数据的同时执行一些数据后处理,以便在进行排序之前丢弃一些不需要的数据(噪声)。
总之,数据大小减少和排序/合并导致实现我的目标所需的计算资源大量减少。
感谢您的所有有用的评论。