我有一个大的文本文件〜8GB,我需要做一些简单的过滤,然后对所有行进行排序。我在一台配备SSD和128GB RAM的28核机器上。我试图为什么使用pipe进行排序(linux命令)很慢?
方法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)分钟。管道排序时为什么排序很慢?它不是平行的吗?
EDIT
awk
和myBigFile
并不重要,这个实验是重复的通过简单地使用seq 1 10000000 | sort --parallel 56
(感谢@Sergei Kurenkov),并且我还观察到使用未管道版本六倍速度的提高我的机器。
尝试添加-S8G来分配一个8G缓冲区到管道的排序读数,看看是否有帮助。要一致地测量,你可能希望在每次运行之前(例如myBigFile在第一次读取之后缓存)[删除缓存](https://linux-mm.org/Drop_Caches),尽管这并不能解释这么大的差别。 –
@JimD。这真的有帮助!现在比编写中间文件到SSD稍慢(134秒比105秒)(但不应该更快......?) – bbvan
从管道读取时,排序不知道输入的时间长短。当从文件中读取时,它知道它有多大。除此之外,该文件缓存在128GB内存的系统上,因此排序实际上并不是从磁盘读取,而是从缓存中读取。所以我认为这种差异是由于知道投入是巨大的,并且有效地划分工作的效率,而管道中的排序必须发现输入是巨大的(即使没有-S也不会这样做)。 –