python – 增量压缩和一次压缩有什么区别?

我试图在python中使用bz2和/或lzma包.我试图压缩csv格式的数据库转储,然后将其放入zip文件.我得到它与两个包的一次压缩工作.

代码如下所示:

with ZipFile('something.zip', 'w') as zf:
    content = bz2.compress(bytes(csv_string, 'UTF-8'))  # also with lzma
    zf.writestr(
        'something.csv' + '.bz2',
        content,
        compress_type=ZIP_DEFLATED
    )

当我尝试使用增量压缩时,它会创建一个.zip文件,当我尝试提取时,它会递归地提供一些存档文件.

代码如下所示:

with ZipFile('something.zip', 'w') as zf:
    compressor = bz2.BZ2Compressor()
    content = compressor.compress(bytes(csv_string, 'UTF-8'))  # also with lzma
    zf.writestr(
        'something.csv' + '.bz2',
        content,
        compress_type=ZIP_DEFLATED
    )
    compressor.flush()

我浏览了文档并查找了有关压缩技术的信息,似乎没有关于单次压缩和增量压缩的全面信息.

解决方法:

单次触发和增量之间的区别在于,对于单次触发模式,您需要将整个数据存储在内存中;如果你正在压缩一个100千兆字节的文件,你应该有大量的内存.

使用增量编码器,您的代码可以一次为压缩器提供1兆字节或1千字节,并在可用时立即将任何数据结果写入文件.另一个好处是可以使用增量压缩器来传输数据 – 您可以在所有未压缩数据可用之前开始编写压缩数据!

您的第二个代码不正确,这将导致您丢失数据.刷新可能会返回您需要保存的更多数据.在这里,我在Python 3中压缩一个1000’a’字符串; compress的结果是一个空字符串;从flush返回实际的压缩数据.

>>> c = bz2.BZ2Compressor()
>>> c.compress(b'a' * 1000)
b''
>>> c.flush()
b'BZh91AY&SYI\xdcOc\x00\x00\x01\x81\x01\xa0\x00\x00\x80\x00\x08 \x00 
\xaamA\x98\xba\x83\xc5\xdc\x91N\x14$\x12w\x13\xd8\xc0'

因此,您的第二个代码应该是:

compressor = bz2.BZ2Compressor()
content = compressor.compress(bytes(csv_string, 'UTF-8'))  # also with lzma
content += compressor.flush()    

但实际上你仍然以非常复杂的方式进行一次性压缩.

上一篇:Linux---文件压缩与解压缩命令


下一篇:linux压缩和打包工具gzip_bzip2_xz_zip_tar