xz: 高压缩打包工具

xz 是一款高性能、高压缩比的打包工具,相比于 gzipbzip2 等具有更高的压缩比率。对于大容量的数据文件,可以使用 xz 进行压缩打包。

目前我们拥有中国期货市场从2010年至今的所有合约分笔数据(Tick Data),因其文件较大,占用空间,对于这部分的数据原始文件,我们已经清洗干净并已录入 MySQL 数据库。因此,对于原始的数据,我们希望将其压缩后,打包存放,以减少占用的磁盘空间。

/images/2017-10-11-xz/xz01.png

安装

CentOS

1
sudo yum -y install xz xz-devel

Ubuntu

1
sudo apt-get install xz-utils

基本操作

压缩文件

xz 默认的会在压缩完成后,删除原始的文件。这一点需要特别注意,对于一些不愿意删除的文件,我们可以使用参数 -k 来保留。

1
2
3
4
5
6
7
8
## 单文件,压缩存入 file.txt.xz, 并删除原始文件 file.txt
xz file.txt         

## 多文件,分别存入 file1.txt.xz, file2.txt.xz, 并删除文件 file1.txt, file2.txt
xz file1.txt file2.txt 

## 不删除文件,使用 -k 来限制
xz -k file.txt

解压文件

同样的,xz在解压文件的时候,默认的会删除压缩包。所以我们需要增加参数 -k 来现在不删除原始的压缩包。

1
2
3
4
5
## 解压文件,并删除 file.txt.xz
unxz file.txt.xz

## 解压文件,但不删除原始压缩包文件,file.txt.xz
unxz -k file.txt.xz

显示压缩包信息

1
xz -l file.txt.xz

调整压缩率

可以使用 0-9 来表明想要得到的压缩率,分别从低压缩比率到高压缩比率。压缩比越高,则压缩后得到的文件占用空间越小,但同时也意味着系统需要使用更多的时间来处理压缩。

1
2
3
xz -0kv file.txt

xz -9kv file.txt

启动极限模式

通过使用极限模式,xz 将尽可能的最大化利用当前系统空余的CPU资源,这将提高程序的处理能力。

1
2
## 最高压缩比,启动极限模式,保留原始文件,显示具体处理过程
xz -9ekv file.txt

多线程

一般来说,现在的电脑都是多核多线程的操作系统,尤其是对于我们目前在使用的服务器系统CentOS,最大配置了32核的CPUxz 默认使用单核单线程,如果需要提升运算性能,我们可以设置多线程来增加压缩处理的能力。这个参数就是 --threads=nn 为设置的数字;如果为0,则会使用系统所有的线程资源。

1
2
3
4
5
## 启用 8 线程
xz -9ekv --threads=8 file.txt

## 启用所有的线程资源
xz -9ekv --threads=0 file.txt

文件夹压缩打包

最后,来介绍一下对整个文件夹的压缩及打包。这里有两种方法可以选择

  • 现在打包文件夹,然后再进行压缩处理。
  • [推荐]直接使用集成的命令来完成打包与压缩。

我这里使用集成命令:

1
2
## J 代表使用 xz 来压缩文件夹
tar -Jcvf file.tar.xz directory/

但是,我们上面提到 xz 还提供了多种参数,如果在使用集成命令 tar 的时候,我们也系统能够传入参数,则可以使用命令

1
2
## 传入参数设置
XZ_OPT='-9ek --threads=12' tar -Jcvf $i.tar.xz $i/

打包期货数据

以下是我写的一个 shell 脚本,用于打包中国期货分笔数据的原始csv文件。事实证明,xz 确实能够极大的较少文件占用的磁盘空间。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# 打包 FromDC 的数据文件
# 
LOG_FILE=tar_FromDC.txt
exec 3>&1 1>> /home/fl/myLog/${LOG_FILE} 2>&1

echo -e "\n==============================================================================="
echo -e ">> $(date +'%Y-%m-%d %H:%M:%S') << tar_FromDC.sh"
echo -e  "================================================================================"

cd /data/ChinaFuturesTickData/TickData

for i in {2010..2016}
do
echo -e  "--------------------------------------------------------------------------------"
echo `date`
echo $i
echo ">>"
XZ_OPT='-9ekv --threads=12' tar -Jcvf $i.tar.xz $i/
echo -e  "--------------------------------------------------------------------------------"
done
0%