用于python的lz4frame库(通过c绑定)
py-lz4framed_ph4的Python项目详细描述
概述
这是一个用于python的LZ4帧压缩库 v3.2+(和2.7+),绑定到yann collet的LZ4 C implementation。
安装/打包
# To get from PyPI pip3 install py-lz4framed_ph4 # To only build extension modules inline (e.g. in repository) python3 setup.py build_ext -i # To build & install globally python3 setup.py install # To install locally with pip pip install --upgrade --find-links=. .
注释
- 上面以及所有其他使用命令的python3也应该运行 使用v2.7+
- 这个叉子是基于https://github.com/Iotic-Labs/py-lz4framed
改进
这个叉子有几个改进,我需要为我的其他项目。
- 流式解压缩继续(重新连接时)
- 流式解压缩状态克隆-检查点
- 流式解压缩封送处理-故障恢复,检查点设置
更多关于改进的信息
场景改进地址是下载 LZ4动态数据流(数百GB)。如果下载流是 中断了原来的减压器无法恢复 在停止的地方减压。
续
主要动机是从上述干扰中恢复过来。 decompressor对象现在支持更改 从中读取。如果输入套接字流下降,我们可以重新连接 从停止的位置继续。更多测试 test_decompressor_fp_continuation。
状态克隆
如果处理逻辑更复杂,可以使用 clone_decompression_context以克隆解压缩程序上下文(整个 解压状态)并在出现故障时还原到此检查点。 更多测试test_decompressor_fp_clone。
州编组
为了从程序崩溃中恢复,您可以封送/ 将解压缩程序上下文序列化为(字节)字符串,该字符串可以是 稍后解封/反序列化并从这一点继续。 封送处理状态可以存储在文件中。更多测试 test_decompressor_fp_marshalling。
随机存取档案
情况:800 GB LZ4加密文件。你想随机访问文件所以 它可以从不同的偏移量进行映射/缩小或并行处理。
封送处理的解压缩程序状态只占用所需的内存量。 如果在块边界上执行状态转储(即 上一个调用的大小提示是由输入流提供的)。 在最佳情况下,marhsalled大小只有184b,66kb英寸 更糟糕的情况-当LZ4文件使用链接模式时。
无论如何,当状态封送处理返回这个小状态时,应用程序 可以构建一个元文件,映射:在输入流中的位置->; 解压器上下文。有了这个元文件,一个新的解压器可以跳到 特定的检查站。
用法
单功能操作:
importlz4framedcompressed=lz4framed.compress(b'binary data')uncompressed=lz4framed.decompress(compressed)
迭代压缩(文件或bytesio实例):
withopen('myFile','wb')asf:# Context automatically finalises frame on completion, unless an exception occurswithCompressor(f)asc:try:while(...):c.update(moreData)exceptLz4FramedNoDataError:pass
从类似文件的对象解压缩:
withopen('myFile','rb')asf:try:forchunkinDecompressor(f):decoded.append(chunk)exceptLz4FramedNoDataError:# Compress frame data incomplete - error case...
另请参见lz4framed/__main__.py 示例用法。
文档
importlz4framedprint(lz4framed.__version__,lz4framed.LZ4_VERSION,lz4framed.LZ4F_VERSION)help(lz4framed)
命令行实用程序
python3 -mlz4framed USAGE: lz4framed (compress|decompress)(INFILE|-)[OUTFILE](De)compresses an lz4 frame. Input is read from INFILE unless set to '-', in which case stdin is used. If OUTFILE is not specified, output goes to stdout.
为什么?
唯一一个现有的LZ4帧互操作实现,我知道 写作时 (lz4tools)具有以下特性 限制:
- 不完整的实现,例如引用和内存泄漏 失败时
- 缺少单元测试
- 非线程安全
- 在低水平(de)压缩操作期间不释放gil
- 没有满足外部项目的要求