最近在给服务器迁移数据,但是数据实在太大,迁移起来非常慢,于是不得不打包进行传输,但是打包压缩还是比较慢,于是想到利用多线程打包压缩来提高速度。这次内容我们来介绍一下如何多线程打包压缩数据。
顺序读写与随机读写
不知道大家是否有这样的经历,当进行数据传输过程中,如果文件特别多,传输起来就比较慢,而将数据打包为一个文件传输,速度就快很多。这是由于磁盘的特性所决定的。
所谓顺序读写是将文件写到硬盘一个连续的区域,而随机读写是在零零散散的存储空间或数据存放地址不集中在某个连续空间,进行数据的读取和写入。大文件可以进行顺序读写。很显然,顺序读写要优于随机读写,且机械硬盘的寻道时间也无法忽略,顺序读写减少了磁盘寻道的时间。这就是为什么传输一个大文件比传输同样大小的很多小文件要快很多的原因。
比如bioconda的安装目录,下面有非常多的小文件,如果一个个传输非常慢,这个时候如果将整个目录打包压缩为一个大文件,则传输起来就会快很多。
打包压缩
打包压缩是对文件操作的两个过程,往往可以通过一条命令完成,因此往往容易混淆。
打包是对文件夹进行处理,将多个文件合成一个,打包并不改变文件大小。而压缩非常容易理解,是将单个文件进行压缩,减小文件大小,便于传输,节省磁盘空间。
在Linux系统下有很多压缩算法,比如gzip,bzip2,pigz等,还有更古老的zip软件。gzip和bzip2是文件压缩工具,默认直接对源文件进行处理,压缩比率在2/3左右,都可以进行设置。加上un,为unpack的意思,表示解压缩。
gzip a.txt
gunzip a.txt.gz
tar是一个比较复杂的命令,tar主要用于打包,由于tar能调用gzip或者bzip2进行压缩,而打包和压缩经常如windows系统一样合并为一个过程,新手经常将二者混淆,
-c 建立打包档案,可搭配 -v 来察看过程中被打包的档名(filename)
-t 察看打包档案的内容含有哪些档名,重点在察看『档名』就是了;
-x 解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
辅选项:
-j 透过 bzip2 的支持进行压缩/解压缩:此时档名最好为 *.tar.bz2
-z 透过 gzip 的支持进行压缩/解压缩:此时档名最好为 *.tar.gz
-v 在压缩/解压缩的过程中,将正在处理的文件名显示出来!
-f filename -f 后面要立刻接要被处理的档名!
对于初学者,记住c是creat,创建,x是解包,z对应gzip,j对应bzip2即可,所以常用的命令如下:
gz文件操作
tar -zcvf filename.tar.gz A B C #打包压缩为gz结尾文件
tar -zxvf filename.tar.gz # 解压缩.tar.gz 结尾文件
bz2文件操作
tar -jcvf filename.tar.bz2 A B C #打包压缩为bz2结尾文件
tar -jxvf filename.tar.bz2 # 解压缩.tar.bz2结尾文件
多线程打包压缩
tar和gzip或者bzip配合可以完成绝大部分的工作,通常文件都不大,感受不到太大的差距,但是当文件很多且非常大时,使用多线程操作可以极大减少打包压缩和解压缩时间。
pigz可以实现多线程的压缩和解压缩,使用起来非常简单,只需要通过-p选项添加多线程即可。
pigz -p 12 a.txt # 使用12线程进行压缩
pigz -d -p 12 a.txt.gz # 使用12线程进行解压缩
pigz没有整合到tar选项参数中,一种方法是先使用tar命令对文件进行打包,然后在使用多线程进行压缩。
tar -cvf filename.tar A B C #打包压缩为gz结尾文件
pigz -p 12 filename.tar # 解压缩.tar.gz 结尾文件
#多线程打包压缩文件
tar -I 'pigz -p 12 -k' -pcvf filename.tar.gz A B C
#多线程解压缩文件
tar -I 'pigz -p 12 -k' -pxvf filename.tar.gz
# 使用管道多线程压缩
tar -cvf A B C | pigz -p 12 -k >filename.tar.gz