Linux(29) 多线程快速解压缩|删除|监视大型文件

简介: Linux(29) 多线程快速解压缩|删除|监视大型文件

在Linux下,偶尔需要处理一些大型的压缩文件(25G以上),例如.tar.gz.zip格式的文件。这些文件通常包含了一些重要的数据或代码,例如Android/Linux源码。如果想要查看或修改这些文件,我们就需要先解压缩它们。传统的解压缩命令,如tarunzip,会花费很长的时间,因为它们只能使用单个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文件的解压过程的步骤:

  1. 安装pigz: 如果还没有安装pigz,可以使用包管理器来安装。例如在Ubuntu上:
sudo apt-get update
sudo apt-get install pigz
  1. 多线程解压: 使用tar命令结合pigz来解压.tar.gz文件。为了解压rk_android13.0_sdk_20230901.tar.gz,可以使用以下命令:
tar xf rk_android13.0_sdk_20230901.tar.gz --use-compress-program=pigz
  1. 这个命令会使用所有可用的CPU核心来解压文件。如果想限制使用的核心数,可以使用-p选项。例如,使用24个核心:
tar xf rk_android13.0_sdk_20230901.tar.gz --use-compress-program="pigz -p 24"

这样就可以利用多线程来快速解压大的.tar.gz文件了。

使用rsync加速删除大量文件

参考: linux下关于删除大量文件的比对

可能需要先删除一个包含大量文件的目录。如果使用传统的rm -rf命令,可能会变得相对较慢,因为它会逐一删除每个文件。在这种情况下可以尝试使用rsync来加速删除过程。以下是如何使用rsync来删除一个目录的步骤:

  1. 创建一个空目录: 需要一个空目录作为源目录,用于同步到目标目录。例如可以创建一个名为empty_dir的空目录:
mkdir empty_dir
  1. 使用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/
  1. 这里:
  • -a:归档模式,表示递归复制并保留文件属性。
  • --delete:删除目标目录中的文件,使其与源目录同步。

可以利用rsync来快速删除一个包含大量文件的目录了。

使用pv查看进度

在上面的方法中,使用了一些命令来加速解压缩或删除过程。但是这些命令通常不会显示进度信息,这可能会让我们感到不确定或不耐烦。可以使用pv来实现。pv是一个终端工具,可以用来查看通过管道传输的数据的进度。以下是如何使用pv来查看解压缩或删除过程的进度的步骤:

  1. 安装pv: 如果还没有安装pv,可以使用包管理器来安装。例如Ubuntu上:
sudo apt-get update
sudo apt-get install pv
  1. 使用pv查看解压缩进度: 可以将pvtarpigz结合使用来查看解压缩进度。使用pv来监视文件的读取进度,然后通过管道将数据传递给tarpigz
pv rk_android13.0_sdk_20230901.tar.gz | tar xf - --use-compress-program=pigz
  1. 这里我们需要指定文件的总大小,以便pv能够正确显示百分比和剩余时间。可以使用以下命令来获取文件的总大小(以字节为单位):
du -b rk_android13.0_sdk_20230901.tar.gz | cut -f 1
  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会显示一个进度条,表示已经读取的数据量、总数据量、百分比、已用时间、剩余时间和当前速度。

  1. 使用pv查看删除进度: 可以将pvrsync结合使用来查看删除进度。首先,使用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
  1. 这里:
  • -l:表示按行计数。
  • -s $(du -s --block-size=1 rk_android13.0_sdk_20230901/ | cut -f 1):表示设置进度条的总大小为目标目录的大小。

当删除目录时,pv会显示一个进度条,表示已经删除的文件数、总文件数、百分比、已用时间、剩余时间和当前速度。

目录
打赏
0
0
1
0
75
分享
相关文章
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
Linux|Transfer.sh 轻松实现文件共享
Linux|Transfer.sh 轻松实现文件共享
22 2
Linux|Transfer.sh 轻松实现文件共享
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
70 34
linux怎么把文件传到docker里面
在现代应用开发中,Docker作为流行的虚拟化工具,广泛应用于微服务架构。文件传输到Docker容器是常见需求。常用方法包括:1) `docker cp`命令直接复制文件;2) 使用`-v`选项挂载宿主机目录,实现数据持久化和实时同步;3) 通过SCP/FTP协议传输文件;4) 在Dockerfile中构建镜像时添加文件。选择合适的方法并确保网络安全是关键。
31 1
|
17天前
|
Linux文件与目录的日常
目录的切换 一般使用(”pwd“)显示当前所在的目录 比如:当前目录是在home下面的,与用户名相同的文件夹,可以使用(”cd“)命令来切换目录; 进入下载目录(”cd home/a/下载“)这种从给目录开头的一长串路经”叫做绝对路径“; 进入图片目录(”cd .. /图片/“)".."代表当前路径的上级路径,相对于当前的目录而言的”叫做相对路径“,(”.“)代表当前路径; 如果,想快速切换,上一个所在目录可以(”cd - / cd..“); 如果,想快速切换,追原始的目录可以(”cd --“); 查看目录及文件
36 14
|
12天前
|
Linux 将所有文件和目录名重命名为小写
Linux 将所有文件和目录名重命名为小写
23 3
|
17天前
|
Linux压缩与解压“助手”
gzip压缩解压 因为都是系统自带的我们不需要安装; ls 看一下目录当前的文件,创建一个 touch 123.txt 文件; 原文件消失,压缩解压 gzip 进行压缩,(“ gzip 123.txt ”),这样就压缩完毕了; gzip 进行解压,(“ gzip -d 123.txt.gz”),这样就解压完毕了; 原文件保留,gzip -k 123.txt、gzip -dk 123.txt.gz ;
33 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
99 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
3月前
|
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
347 14
|
3月前
|
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
197 6