xz 是一款高性能、高压缩比的打包工具,相比于 gzip、bzip2 等具有更高的压缩比率。对于大容量的数据文件,可以使用 xz 进行压缩打包。
目前我们拥有中国期货市场从2010年至今的所有合约分笔数据(Tick Data),因其文件较大,占用空间,对于这部分的数据原始文件,我们已经清洗干净并已录入 MySQL 数据库。因此,对于原始的数据,我们希望将其压缩后,打包存放,以减少占用的磁盘空间。

  安装
  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
 | 
 
  显示压缩包信息
  调整压缩率
可以使用 0-9 来表明想要得到的压缩率,分别从低压缩比率到高压缩比率。压缩比越高,则压缩后得到的文件占用空间越小,但同时也意味着系统需要使用更多的时间来处理压缩。
| 1
2
3
 | xz -0kv file.txt
xz -9kv file.txt
 | 
 
  启动极限模式
通过使用极限模式,xz 将尽可能的最大化利用当前系统空余的CPU资源,这将提高程序的处理能力。
| 1
2
 | ## 最高压缩比,启动极限模式,保留原始文件,显示具体处理过程
xz -9ekv file.txt
 | 
 
  多线程
一般来说,现在的电脑都是多核多线程的操作系统,尤其是对于我们目前在使用的服务器系统CentOS,最大配置了32核的CPU。xz 默认使用单核单线程,如果需要提升运算性能,我们可以设置多线程来增加压缩处理的能力。这个参数就是 --threads=n。n 为设置的数字;如果为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
 |