当前位置: 首页 > 面试题库 >

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

詹钊
2023-03-14
问题内容

我有一个〜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)而重复进行,而且我还发现在我的机器上使用非管道版本可以使速度提高六倍。


问题答案:

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

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



 类似资料:
  • 本文向大家介绍CMD命令行管道命令使用介绍,包括了CMD命令行管道命令使用介绍的使用技巧和注意事项,需要的朋友参考一下 一、什么是管道命令   管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息。   如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将dir的结果进行筛选,只保留需要的信息 | 命令管道符 格式:第一条命令 | 第二条命令 [|

  • 问题内容: 我想知道是否有一种方法可以在Go中运行一定的时间,然后在从通道接收到值后将其杀死。在似乎不支持命令管道。谢谢。 问题答案: 这是我的管道示例,通过OS Std Pipe归档一个调用文件b,您可以对其进行编辑并添加计时器以执行所需的操作。 文件b:

  • 我试图使用Java的类来执行包含管道的命令。例如: 然而,我得到了一个错误: 然后: 尽管该命令在命令行中运行得很好,但我无法让执行将其输出重定向到另一个的命令。 有没有办法做到这一点?

  • stephen@stephens-MacBook-Pro ~ % find ./ -name 'charles*'|xargs rm -rf stephen@stephens-MacBook-Pro ~ % find ./ -name 'charles*' .//Library/Application Support/Charles/ca/charles-proxy-ssl-proxying-ce

  • 本文向大家介绍在命令行用 sort 进行排序的方法,包括了在命令行用 sort 进行排序的方法的使用技巧和注意事项,需要的朋友参考一下 Linux sort命令用于将文本文件内容加以排序。 sort可针对文本文件的内容,以行为单位来排序。 在 Linux、BSD 或 Mac 的终端中使用 sort 命令,按自己的需求重新整理数据。 如果你曾经用过数据表应用程序,你就会知道可以按列的内容对行进行排序

  • 问题内容: 我试图解析一个文件,该文件的每一行都用管道定界值。当我没有在split方法中转义管道定界符时,它不能正常工作,但是在我如下转义管道后,它却可以正常工作。 有人可以解释为什么该方法需要转义管道字符吗? 问题答案: 需要一个正则表达式参数。未转义的被解析为正则表达式,表示“空字符串或空字符串”,这不是您的意思。