Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 增量压缩和一次性压缩有什么区别?_Python_Python 3.x_Zip_Bzip2_Lzma - Fatal编程技术网

Python 增量压缩和一次性压缩有什么区别?

Python 增量压缩和一次性压缩有什么区别?,python,python-3.x,zip,bzip2,lzma,Python,Python 3.x,Zip,Bzip2,Lzma,我试图在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',

我试图在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
    )
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()
当我尝试使用增量压缩时,它会创建一个.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
    )
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()

我查阅了文档,还查找了有关压缩技术的信息,但似乎没有关于单次压缩和增量压缩的全面信息。

单次压缩和增量压缩的区别在于,在单次压缩模式下,您需要将整个数据存储在内存中;如果你正在压缩一个100G的文件,你应该有大量的RAM

使用增量编码器,您的代码可以一次向压缩器提供1兆字节或1千字节的数据,并在数据可用时将任何数据结果写入文件。另一个好处是,您可以使用增量压缩器来流式处理数据—您可以在所有未压缩数据可用之前开始写入压缩数据


您的第二个代码不正确,它将导致您丢失数据。
flush
可能会返回更多需要保存的数据。在这里,我在Python3中压缩了1000个
'a'
字符的字符串;压缩的结果是一个空字符串;实际压缩数据是从
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()    

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

您可能需要阅读&谢谢!这很有帮助。单次压缩有点复杂,很难快速理解。您在尝试压缩.bz2文件时花费了过多的时间。我很困惑。第二个示例将导致损坏的
something.csv.bz2
,但不会导致zipfile本身出现任何错误。它应该解压没有问题。顺便说一句,如果您想在zipfile中存储bz2文件,请使用
ZIP\u STORED
。如果您尝试压缩两次,实际上会增加存档的大小。@adarsh您找到解决方案了吗?你的结果是什么啊,太棒了!谢谢这对我来说完全是清白的。尽管我想问,我如何才能以一种不那么复杂的方式来做这件事?我的一次性方法有什么复杂之处?另外,使用其中一种方法比使用另一种方法有任何压缩优势吗?根据这里的解释,en.wikipedia.org/wiki/Incremental_encoding?不,我的意思是你正在使用增量编码器进行“一次性”压缩@AnttiHaapala我仍在寻找使用LZMA SDK进行增量解压缩的方法!你能帮忙吗plz@Frankenstein如果你还有其他问题,那么一定要问另一个问题。@AnttiHaapala实际上问题就在这里