一尘不染

为什么使用管道进行排序(Linux命令)很慢?

linux

我有一个〜8GB的大文本文件,我需要进行一些简单的过滤,然后对所有行进行排序。我使用的是28核计算机,具有SSD和128GB RAM。我努力了

方法1

awk '...' myBigFile | sort --parallel = 56 > myBigFile.sorted

方法2

awk '...' myBigFile > myBigFile.tmp
sort --parallel 56 myBigFile.tmp > myBigFile.sorted

令人惊讶的是,方法1仅需11.5分钟,而方法2仅需(0.75 + 1 <2)分钟。为什么通过管道传输时排序如此缓慢?它不是平行的吗?

编辑

awk而且myBigFile并不重要,这个实验可以简单地通过使用seq 1 10000000 | sort --parallel 56(由于@Sergei Kurenkov)而重复进行,而且我还发现在我的机器上使用非管道版本可以使速度提高六倍。


阅读 347

收藏
2020-06-07

共1个答案

一尘不染

从管道读取时,sort假定文件很小,并且对于小文件,并行性没有帮助。要sort利用并行性,您需要使用告诉它分配一个大的主内存缓冲区-S。在这种情况下,数据文件约为8GB,因此您可以使用-S8G。但是,至少在具有128GB主内存的系统上,方法2可能仍会更快。

这是因为sort方法2可以从文件的大小中得知它很大,并且可以在文件中查找(管道都不可行)。此外,由于与这些文件大小相比,您有太多的内存,因此myBigFile.tmp不需要在awk退出之前sort将所需数据写入磁盘,并且能够从缓存而不是磁盘读取文件。因此,方法1和方法2(在像您这样的具有大量内存的机器上)之间的原理区别是sort方法2知道文件很大,并且可以轻松地划分工作(可能使用seek,但是我没有看过)实现),而方法1
sort必须发现数据量巨大,并且由于无法查找管道,因此在读取输入时不能使用任何并行性。

2020-06-07