介绍
snappy是谷歌开源的用于数据快速压缩和解压的程序库,它的目标并非实现最大压缩率,而是同时实现非常高的压缩速度和合理的压缩率。snappy被广泛应用于google内部和开源的项目中,例如Hadoop, LevelDB, Spark。官方库地址:https://github.com/google/snappy
由于最近的工作需要,发现snappy还实现了两个变种,这两个变种分别实现了snappy算法在本地文件系统和hadoop中的流式编解码。以下分别称之为snappy stream code和hadoop snappy stream codec, 以区分于raw snappy codec.
-
raw snappy codec: 用于对整个文件或整块数据进行编解码.
-
stream snappy codec: 流式编解码。在raw snappy codec上增加了chunk的概念。编解码的最小粒度是chunk。
-
hadoop stream snappy codec: 流式编解码。在raw snappy codec的基础上增加了block的概念。编解码最小粒度是block
那么为什么我们需要snappy流式编解码呢?
因为如果没有流式编解码算法,要对snappy数据进行解压,就必须将数据全部读入到内存,如果文件特别大的话内存可能不够用。因此们需要流式编解码算法,每次从文件流中读取一个frame的数据,解压,再读取,再解压,这样内存占用不至于特别大。
snappy的google官方库并没有实现上述的流式codec, 而python snappy实现了:https://github.com/andrix/python-snappy
以下是个范例
#/usr/bin/env python
# coding: utf-8
import snappy
text_file = "1.txt"
snappy_file = "1.snappy"
with open (text_file, "r") as input_file:
uncompressed_data = input_file.read().encode('utf-8')
# raw snappy codec
compressed_data = snappy.compress(uncompressed_data)
assert uncompressed_data == snappy.uncompress(compressed_data)
# stream snappy codec
c = snappy.StreamCompressor()
d = snappy.StreamDecompressor()
compressed_data = c.compress(uncompressed_data)
assert uncompressed_data == d.decompress(compressed_data)
# hadoop stream snappy codec
c = snappy.hadoop_snappy.StreamCompressor()
d = snappy.hadoop_snappy.StreamDecompressor()
compressed_data = c.compress(uncompressed_data)
assert uncompressed_data == d.decompress(compress