【发布时间】:2013-08-30 09:40:09
【问题描述】:
我有一个 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”技巧提供了 2 倍的速度增益(感谢 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
我在下面使用了 Chris 和您的建议。
由于数据已经批量生成:我分别对每个存储桶进行了排序(在几台不同的机器上),然后使用了“sort --merge”功能。像魅力一样工作并且速度更快:O(log N / K)与O(log N)。
我还从头开始重新考虑该项目:现在在生成数据的同时执行一些数据后处理,以便在进行排序之前丢弃一些不需要的数据(噪声)。
总而言之,数据大小减少和排序/合并导致实现我的目标所需的计算资源大量减少。
感谢您提供的所有帮助。
【问题讨论】:
-
如果磁盘饱和,您不需要更多线程。排序期间磁盘是否为 100%?最大的“潜在”加速将来自了解您的数据。所有行的长度是否相同,连续行之间是否有任何共同点,...?
-
谢谢 - 磁盘未饱和。大部分时间实际上都花在了排序上。几乎没有 I/O 等待。行具有相同的结构(csv 文件)但长度不同。
-
出于好奇:这个问题有后续吗?你最终做了什么?
-
存在external sorting 算法,用于无法放入 RAM 的如此庞大的数据集。虽然它们通常较慢,但对于这种特殊情况,它们要快得多。
标签: linux algorithm sorting bigdata