增量压缩和单次压缩之间有什么区别?


问题内容

我试图在python中使用bz2and /
orlzma包。我正在尝试以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 GB的文件,则应该有大量的RAM。

使用增量编码器,您的代码可以一次向压缩器提供1 MB或1 KB的数据,并将任何数据结果写入文件中。另一个好处是,可以使用增量压缩器来流传输数据-
您可以在所有未压缩数据可用之前就开始写入压缩数据!


您的第二个代码 不正确 ,这将导致您丢失数据。在flush你需要保存以及可以返回更多的数据。在这里,我'a'在Python
3中压缩了1000个字符的字符串。结果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()

但是实际上,您仍然以非常复杂的方式进行一次压缩。