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
|