当在Linux中执行时,我一直试图了解下面的命令所涉及的执行以及内部数据结构和算法。
bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_filesort排序可以不同时拥有所有输入吗?mybig.bz2的大小为20 in,那么排序是如何为这样大的文件管理磁盘中的所有中间结果的?
使用重定向和中间文件。
bzip -dc mybig.bz2 > temp1
cut -d ',' -f 1,2,4,5,9,10,12 temp1 > temp2
sort temp2 > output_file用管道。
bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_file是否有更好的方法使用shell,其中cat、cut和sort并行运行(行缓冲),并且磁盘I/O和cpu周期最小?
任何帮助都非常感谢。
发布于 2017-04-26 14:32:28
使用重定向和中间文件的
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。然后,上述情况将:
总的磁盘I/O值为1+10+10+10+10+10+10+10 = 71 GB。
使用管道的
bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_file给你:
在总的磁盘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数据成为可能--只要数据存储在磁盘上时是压缩的。
https://stackoverflow.com/questions/43602042
复制相似问题