在Linux下,偶尔需要处理一些大型的压缩文件(25G以上),例如.tar.gz
或.zip
格式的文件。这些文件通常包含了一些重要的数据或代码,例如Android/Linux源码。如果想要查看或修改这些文件,我们就需要先解压缩它们。传统的解压缩命令,如tar
或unzip
,会花费很长的时间,因为它们只能使用单个CPU核心来处理数据。有没有什么方法可以利用多核心来加速解压缩过程呢?答案是必须的。在本文中,我将测试过的一些在Linux下使用多线程快速解压缩|删除|监视大型文件的方法形成笔记。
这几天我搞家里的服务器发现了一些问题 关于大型文件的压缩|解压|删除|编译的问题
首先,我测试了纯Linux系统,然后是WSL2 和 VMware , Docker
发现其实最终和硬盘有非常大的关系 无论你怎么花里胡哨的多线程 硬盘对4K小文件读写速度跟不上都速度快不起来。
对比结果(大概直观印象排序):
首先我的环境是有M.2 SSD(系统盘)+HDD(资料盘)
纯Linux系统 , VMware , Docker , WSL2 : 系统是装在SSD中 , 但是代码在HDD中 , 硬盘读写速率的差异会导致压缩|解压|删除|编译非常慢。
有条件的话还是直接上M.2 SSD,目前国产的价格挺便宜的,PCIE3.0 2T 550左右,读写有3500MB
PCIE 4.0 4T 1100左右,读写有7500MB,实测解压25G 36线程 1分钟左右。
使用pigz加速gzip压缩和解压
pigz
是一个用于加速gzip压缩和解压的工具,它可以利用多核心来并行处理数据。它与标准的gzip
命令完全兼容,只是更快。以下是如何使用pigz
来加速.tar.gz
文件的解压过程的步骤:
- 安装pigz: 如果还没有安装
pigz
,可以使用包管理器来安装。例如在Ubuntu上:
sudo apt-get update sudo apt-get install pigz
- 多线程解压: 使用
tar
命令结合pigz
来解压.tar.gz
文件。为了解压rk_android13.0_sdk_20230901.tar.gz
,可以使用以下命令:
tar xf rk_android13.0_sdk_20230901.tar.gz --use-compress-program=pigz
- 这个命令会使用所有可用的CPU核心来解压文件。如果想限制使用的核心数,可以使用
-p
选项。例如,使用24个核心:
tar xf rk_android13.0_sdk_20230901.tar.gz --use-compress-program="pigz -p 24"
这样就可以利用多线程来快速解压大的.tar.gz
文件了。
使用rsync加速删除大量文件
可能需要先删除一个包含大量文件的目录。如果使用传统的rm -rf
命令,可能会变得相对较慢,因为它会逐一删除每个文件。在这种情况下可以尝试使用rsync
来加速删除过程。以下是如何使用rsync
来删除一个目录的步骤:
- 创建一个空目录: 需要一个空目录作为源目录,用于同步到目标目录。例如可以创建一个名为
empty_dir
的空目录:
mkdir empty_dir
- 使用rsync同步并删除: 使用
rsync -a --delete empty_dir/ rk_android13.0_sdk_20230901/
命令来同步空目录到想要删除的目录,并删除所有文件。例如,如果想要删除名为rk_android13.0_sdk_20230901
的目录中的所有内容,可以使用以下命令:
rsync -a --delete empty_dir/ rk_android13.0_sdk_20230901/
- 这里:
-a
:归档模式,表示递归复制并保留文件属性。--delete
:删除目标目录中的文件,使其与源目录同步。
可以利用rsync
来快速删除一个包含大量文件的目录了。
使用pv查看进度
在上面的方法中,使用了一些命令来加速解压缩或删除过程。但是这些命令通常不会显示进度信息,这可能会让我们感到不确定或不耐烦。可以使用pv
来实现。pv
是一个终端工具,可以用来查看通过管道传输的数据的进度。以下是如何使用pv
来查看解压缩或删除过程的进度的步骤:
- 安装pv: 如果还没有安装
pv
,可以使用包管理器来安装。例如Ubuntu上:
sudo apt-get update sudo apt-get install pv
- 使用pv查看解压缩进度: 可以将
pv
与tar
和pigz
结合使用来查看解压缩进度。使用pv
来监视文件的读取进度,然后通过管道将数据传递给tar
和pigz
。
pv rk_android13.0_sdk_20230901.tar.gz | tar xf - --use-compress-program=pigz
- 这里我们需要指定文件的总大小,以便
pv
能够正确显示百分比和剩余时间。可以使用以下命令来获取文件的总大小(以字节为单位):
du -b rk_android13.0_sdk_20230901.tar.gz | cut -f 1
- 然后我们可以将这个值作为参数传递给
pv -s
选项:
pv -s $(du -b rk_android13.0_sdk_20230901.tar.gz | cut -f 1) rk_android13.0_sdk_20230901.tar.gz | tar xf - --use-compress-program=pigz
当解压缩文件时,pv
会显示一个进度条,表示已经读取的数据量、总数据量、百分比、已用时间、剩余时间和当前速度。
- 使用pv查看删除进度: 可以将
pv
与rsync
结合使用来查看删除进度。首先,使用du -s --block-size=1 your_large_dir/ | cut -f 1
命令来获取想要删除的目录的总大小(以字节为单位)。然后,使用以下命令来同步空目录并删除所有文件:
rsync -a --delete --progress empty_dir/ rk_android13.0_sdk_20230901/ | pv -l -s $(du -s --block-size=1 rk_android13.0_sdk_20230901/ | cut -f 1) > /dev/null
- 这里:
-l
:表示按行计数。-s $(du -s --block-size=1 rk_android13.0_sdk_20230901/ | cut -f 1)
:表示设置进度条的总大小为目标目录的大小。
当删除目录时,pv
会显示一个进度条,表示已经删除的文件数、总文件数、百分比、已用时间、剩余时间和当前速度。