'sort -u'对于大型文件的可伸缩性


23

'sort -u'的合理可伸缩性限制是多少?(以“行长”,“行数”,“文件总大小”为单位?)

对于超出“行数”维的文件,Unix的替代方案是什么?(当然,我可以轻松实现一个,但是我想知道是否可以用很少的标准Linux命令来完成某些工作?)


对于那些可能想要在其中进行二进制搜索或知道如何进行二进制搜索的人:unix.stackexchange.com/q/247508/9689
Grzegorz Wierzowiecki

2
在某些情况下,uniq先于sort -u帮助。顺便说一句,对于ASCII数据LC_ALL=C sort,GNU sort的速度
大大

Answers:


39

sort你在Linux上找到来自的coreutils包和工具的外部R-路合并。它将数据拆分成可以在内存中处理的数据块,将其存储在磁盘上,然后合并它们。如果机器具有处理器,则这些块将并行完成。

因此,如果有限制,则可用磁盘空间sort来存储必须合并的临时文件以及结果。


3
请注意,GNU排序可以压缩这些临时文件以打包更多文件(并通过慢速磁盘提高性能)。
斯特凡Chazelas

1
@StéphaneChazelas感谢您的更新。我想知道自己是否足够聪明,可以完全合并一个块文件(如果已对源进行部分排序,则很容易发生),以进行空间优化。这些天我没有时间去研究源代码:-(
Anthon

3
除内存外,合并阶段还有另一个限制:可以同时打开的文件数。这通常是操作系统施加的限制。GNU也可以通过递归合并一次可以打开的旧文件数来解决这一问题!
Diomidis Spinellis

@StéphaneChazelas如果我正在设计一个专门用于对非常大的文件进行排序的工具,我会将这些行作为索引存储到原始文件中。GNU会执行此操作,还是仅使用传统的压缩算法?
Random832

3
@ Random832,它的意思是能够覆盖该文件本身上(sort -o file file
斯特凡Chazelas

1

我不能说供应商特定的实现,但是该UNIX sort实现将大文件拆分为较小的文件,对这些文件进行排序,然后将排序的较小文件组合为汇总的排序输出。

唯一的限制是中间创建的较小文件的磁盘空间sort,但是可以通过设置环境变量将文件重定向到任意目录TMPDIR


3
您究竟将其称为 UNIX sort实现?它是Unix版本3的原始版本吗?那里的手册页说它不能排序大于128KiB的文件。
斯特凡Chazelas

您对Unix版本3了解什么?1973年的版本?多年来,原始的UNIX排序实现和IIRC已得到增强,Solaris版本甚至比GNU版本要快得多。当然,在25年前,排序功能已得到增强,可以理解多字节字符,而我在USENET讨论中还记得,这是在Solaris上有效完成的。BTW:man largefile列出sort大文件感知。
2016年

2
那么,您实际上是在谈论Oracle供应商特定的版本sort吗?还是某些AT&T Unix版本的衍生产品?还是任何经过Unix认证的版本sort(例如sortOS / X上的GNU )?
斯特凡Chazelas

sort关于多字节字符的现代实现的质量可能会有所不同,sort使用拆分中间文件的事实对于所有基于原始代码的UNIX实现都是常见的。BTW:在Solaris版本是OSS为“OpenSolaris的”,见sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/...
席利

25年前,还没有发明UTF-8吗?在的Solaris 7(加入为UTF-8语言支持12)。您是否在指其他一些多字节字符集?
斯特凡Chazelas

1

基于https://blog.mafr.de/2010/05/23/sorting-large-files//unix//a/88704/9689

split -n l/20 input input-
for inpf in input-* ; do
    sort --parallel="$(nproc --all)" "${inpf}" > sorted-"{$inpf}"
done
sort -m sorted-input-* > sorted-input

更新:

从上面的答案中,我们sort已经可以看到所提到的代码段即外部R-Way合并。所以毕竟运行只是:

sort --parallel="$(nproc --all)" -u input > output

应该足够了。

我目前关于限制的假设(没有检查代码)是:

  • 最大行长受物理内存量限制。排序需要至少两个适合内存
  • 行数-我不知道
  • 文件大小-当然按文件系统
  • 并行打开的文件数量-取决于操作系统(感谢Diomidis Spinellis指出这一点!)

(此答案被标记为社区Wiki-受到鼓励进行改进!:))


2
GNU sort默认情况下是并行排序的(自从您链接到该页面之后的2010年开始),--parallel这样做是为了减少并发线程的数量,而不是sort确定最佳线程数。Sort已经以一种更有效的方式在内部进行了拆分和合并。我怀疑这样做是否会有所帮助。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.