为什么使用管道进行排序(Linux命令)很慢?
我有一个〜8GB的大文本文件,我需要进行一些简单的过滤,然后对所有行进行排序。我使用的是28核计算机,具有SSD和128GB RAM。我努力了
方法1
awk '...' myBigFile | sort --parallel = 56 > myBigFile.sorted
方法2
awk '...' myBigFile > myBigFile.tmpsort --parallel 56 myBigFile.tmp > myBigFile.sorted
令人惊讶的是,方法1仅需11.5分钟,而方法2仅需(0.75 + 1 <2)分钟。为什么通过管道传输时排序如此缓慢?它不是平行的吗?
awk
而且myBigFile
并不重要,这个实验可以简单地通过使用seq 1 10000000 | sort --parallel
56(由于@Sergei Kurenkov)而重复进行,而且我还发现在我的机器上使用非管道版本可以使速度提高六倍。
回答:
从管道读取时,sort
假定文件很小,并且对于小文件,并行性没有帮助。要sort
利用并行性,您需要使用告诉它分配一个大的主内存缓冲区-S
。在这种情况下,数据文件约为8GB,因此您可以使用-S8G
。但是,至少在具有128GB主内存的系统上,方法2可能仍会更快。
这是因为sort
方法2可以从文件的大小中得知它很大,并且可以在文件中查找(管道都不可行)。此外,由于与这些文件大小相比,您有太多的内存,因此myBigFile.tmp
不需要在awk
退出之前sort
将所需数据写入磁盘,并且能够从缓存而不是磁盘读取文件。因此,方法1和方法2(在像您这样的具有大量内存的机器上)之间的原理区别是sort
方法2知道文件很大,并且可以轻松地划分工作(可能使用seek,但是我没有看过)实现),而方法1
sort
必须发现数据量巨大,并且由于无法查找管道,因此在读取输入时不能使用任何并行性。
以上是 为什么使用管道进行排序(Linux命令)很慢? 的全部内容, 来源链接: utcz.com/qa/400156.html