增量压缩和一次性压缩有什么区别?
What is the difference between incremental and one-shot compression?
我正在尝试使用 python 中的 bz2
and/or 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()
我浏览了文档并查找了有关压缩技术的信息,但似乎没有关于什么是一次性压缩和增量压缩的全面信息。
one-shot 和 incremental 的区别在于,在 one-shot 模式下,您需要将整个数据存储在内存中;如果要压缩 100 GB 的文件,则应该有大量 RAM。
使用增量编码器,您的代码可以一次为压缩器提供 1 兆字节或 1 千字节的数据,并将任何数据结果写入可用的文件中。另一个好处是您可以使用增量压缩器来流式传输数据 - 您可以在所有未压缩数据可用之前开始写入压缩数据!
您的第二个密码不正确,它会导致您丢失数据。 flush
可能 return 您还需要保存更多数据。这里我在 Python 3 中压缩一个 1000 'a'
个字符的字符串; compress
的结果是一个空字符串;实际的压缩数据是 returned from 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()
但实际上您仍在以非常复杂的方式进行一次性压缩。
我正在尝试使用 python 中的 bz2
and/or 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()
我浏览了文档并查找了有关压缩技术的信息,但似乎没有关于什么是一次性压缩和增量压缩的全面信息。
one-shot 和 incremental 的区别在于,在 one-shot 模式下,您需要将整个数据存储在内存中;如果要压缩 100 GB 的文件,则应该有大量 RAM。
使用增量编码器,您的代码可以一次为压缩器提供 1 兆字节或 1 千字节的数据,并将任何数据结果写入可用的文件中。另一个好处是您可以使用增量压缩器来流式传输数据 - 您可以在所有未压缩数据可用之前开始写入压缩数据!
您的第二个密码不正确,它会导致您丢失数据。 flush
可能 return 您还需要保存更多数据。这里我在 Python 3 中压缩一个 1000 'a'
个字符的字符串; compress
的结果是一个空字符串;实际的压缩数据是 returned from 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()
但实际上您仍在以非常复杂的方式进行一次性压缩。