首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输入管道或重定向到排序/uniq命令的内部工作

输入管道或重定向到排序/uniq命令的内部工作
EN

Stack Overflow用户
提问于 2017-04-25 05:06:49
回答 1查看 376关注 0票数 1

当在Linux中执行时,我一直试图了解下面的命令所涉及的执行以及内部数据结构和算法。

代码语言:javascript
复制
bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_file
  1. 当您将一个程序的输出传输到另一个程序时,中间结果存储在哪里?
    • 当我们有排序/uniq之类的命令来接受来自上一个命令的输入时,它是否能够与bzip2并行工作,那么sort排序可以不同时拥有所有输入吗?
    • 由于排序(gnu-coreutils)在内部进行合并排序,那么在执行过程中合并排序的中间结果在哪里排序,例如,如果文件mybig.bz2的大小为20 in,那么排序是如何为这样大的文件管理磁盘中的所有中间结果的?

  1. 如何比较以下两个不同的shell脚本的I/O操作数、中间文件大小和cpu使用情况(我正在寻找更多的理论推理而不是基准测试结果)?

使用重定向和中间文件。

代码语言:javascript
复制
bzip -dc mybig.bz2 > temp1
cut -d ',' -f 1,2,4,5,9,10,12 temp1 > temp2 
sort temp2 > output_file

用管道。

代码语言:javascript
复制
bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_file

是否有更好的方法使用shell,其中catcutsort并行运行(行缓冲),并且磁盘I/O和cpu周期最小?

任何帮助都非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-26 14:32:28

使用重定向和中间文件的

代码语言:javascript
复制
bzip -dc mybig.bz2 > temp1
cut -d ',' -f 1,2,4,5,9,10,12 temp1 > temp2 
sort temp2 > output_file

假设mybig.bz2为1GB,未压缩版本为10 GB。然后,上述情况将:

  • 读1写10 (bzip2 -> temp1)
  • 读10和写10 (剪切,我们假设切割的大小基本上是相同的)
  • 读10,写10,读10和写10 (排序使用临时文件进行大排序)。

总的磁盘I/O值为1+10+10+10+10+10+10+10 = 71 GB。

使用管道的

代码语言:javascript
复制
bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_file

给你:

  • 读取1GB (bzip2 -数据未写入磁盘)
  • 从磁盘中什么也不读(切保存在内存中的一切)
  • 写10 GB,读10 GB和写10 GB (先从内存中读取,然后保存到磁盘上的临时文件,将这些文件读回并写入输出)

在总的磁盘I/O中,1+10+10+10 = 31 GB。

你用管道不会浪费任何东西。相反,如果bzip2与排序速度相同,则可以保持2CPU并行运行。较新版本的排序还支持‘-并行=N’来在多个CPU上分发排序。

如果排序后的数据压缩良好,也可以使用--compress-program=PROG压缩临时文件。如果CPU处于空闲状态,这是非常有用的。根据您空闲的CPU数量,可以使用“pzstd”、“pigz”、“pbzip2 2”、“pxz”。它们有不同程度的压缩(从低到高)。

这样,您就可以将磁盘I/O从31 GB降低到1+1+1+10。

管道的中间结果不存储在任何地方。相反,它一写就被读了。两个进程之间只有一个很小的缓冲区(通常为4-128 KB)。当缓冲区已满时,写入过程会阻塞,直到读取过程已从缓冲区读取内容为止。这种技术使得在一个具有1GB RAM和100 GB磁盘的系统上处理1TB数据成为可能--只要数据存储在磁盘上时是压缩的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43602042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档