当输入或重定向到其时,sort/uniq命令的内部工作



我一直在尝试了解以下命令中涉及的执行和内部数据结构和算法。

bzip -dc mybig.bz2 | cut -d ',' -f 1,2,4,5,9,10,12 | sort > output_file
  1. 当您将一个程序的输出输送到另一个程序时,中间结果存储在哪里?
    • 当我们有类似的命令类似于管道的命令以接受上一个命令的输入时,Sort能够与BZIP2并行工作时,sort可以在不一次所有输入的情况下排序吗?
    • 由于排序(gnu-coreutils(确实在执行过程中内部合并在哪里合并的结果是中间的结果,例如,如果文件 mybig.bz2的大小为20gb,则如何分类在所有中间磁盘中为如此巨大的磁盘进行管理。文件?
  2. 您如何比较以下两个不同的外壳脚本的I/O操作数量,中间文件大小和CPU使用情况(我正在寻找比基准结果更多的理论推理(?

使用重定向和中间文件。

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有更好的方法来使用shell,其中 catcutsort在并行运行(线缓冲(,并且磁盘最小的磁盘i/o和cpu周期是否?

任何帮助。

使用重定向和中间文件

bzip -dc mybig.bz2 > temp1
cut -d ',' -f 1,2,4,5,9,10,12 temp1 > temp2 
sort temp2 > output_file

让我们假设mybig.bz2是1 GB,未压缩版本为10 GB。以上将:

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

总磁盘I/O的1 10 10 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

在这里您:

  • 阅读1 GB(BZIP2-数据未写入磁盘(
  • 从磁盘上读取一无所有(切割可以使所有内容都保持在记忆中(
  • 编写10 GB,读取10 GB并写10 GB(首先从内存中读取,然后在磁盘上保存到临时文件,读回这些文件并写入输出(

总磁盘I/O的1 10 10 10 = 31 GB。

您没有使用管道浪费任何东西。相反,如果BZIP2与排序的速度相同,则可以使2个CPU并行运行。较新版本的排序也支持' - parallel = n'以在多个cpus上分配排序。

如果排序的数据压缩良好,则还可以使用--compress-program=PROG来压缩临时文件。如果您的CPU坐着闲置,这将非常有用。根据您闲置的数量,您可以使用" PZSTD"," Pigz"," Pbzip2"," PXZ"。它们具有不同的压缩水平(从低到高(。

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

管道中的中间结果不会存储在任何地方。相反,它在编写后立即阅读。这两个过程之间只有一个小缓冲区(通常为4-128 kb的顺序(。当缓冲区已满时,写作过程会阻止阅读过程从缓冲区中读取内容。此技术使得可以在具有1 GB RAM和100 GB磁盘的系统上处理1个TB数据 - 只要将数据存储在磁盘上时,该数据就会被压缩。

最新更新