【问题标题】:zlib and lzma go unresponsive when decompressing - python 3.4解压缩时zlib和lzma无响应-python 3.4
【发布时间】:2015-08-23 16:01:43
【问题描述】:

当我使用 lzma 模块或 zlib 模块压缩一个 31kb 的字符串并解压缩它时,python 没有响应并占用了我大约 50% 的 cpu。这些模块适用于较小的字符串。

这是我的代码:

import zlib

open_file = open('big_file.txt','r')

text = open_file.read()

compressed = zlib.compress(text.encode('UTF-8'))
print(compressed)


decompressed = zlib.decompress(bytes(compressed))
print(str(decompressed))

编辑:

CPU:Intel Core 2 Extreme X7900 @ 2.8ghz

内存:3gb DDR 2

操作系统:Windows 10 64bit(管理员权限)

Python 版本:3.4.3 32 位

【问题讨论】:

  • 压缩是否结束?你有 2 个核心吗?
  • 我不知道它是否已经结束,因为我强行关闭了程序。是的,我有 2 个核心。
  • 你能补充一些关于你在什么平台上运行的信息吗? OS、CPU 真机或虚拟机等

标签: python python-3.x zlib lzma


【解决方案1】:

在 Python 3 上不必花那么长时间。请注意,我已将文本读取为字节,并省略了一些 Python 3 上不需要的编码/str 步骤。

在运行频率为 2.5 GHz 的 Intel Core 2 Q9300 上完成的测试。在 FreeBSD 10.2 AMD64 上使用 Clang 3.4.1 编译的 Python 3.4.3(64 位)。

In [1]: import zlib

In [2]: with open('foo.txt', 'rb') as datafile:
    btext = datafile.read()
   ...:     

In [3]: len(btext)
Out[3]: 23931

In [4]: type(btext)
Out[4]: bytes

这个文本大约 23 kiB,并且已经是bytes 的形式,所以不需要编码。

In [5]: compressed = zlib.compress(btext)

In [6]: %timeit zlib.compress(btext)
1000 loops, best of 3: 735 µs per loop

In [7]: len(compressed)
Out[7]: 4787

In [8]: type(compressed)
Out[8]: bytes

In [9]: uncompressed = zlib.decompress(compressed)

In [10]: %timeit zlib.decompress(compressed)
10000 loops, best of 3: 118 µs per loop

压缩和解压缩都以微秒为单位。这几乎不引人注意。

更精确地复制代码会得到大致相同的结果:

In [1]: import zlib

In [2]: with open('foo.txt') as datafile:
    text = datafile.read()
   ...:     

In [3]: %timeit zlib.compress(text.encode('UTF-8'))
1000 loops, best of 3: 767 µs per loop

In [4]: compressed =  zlib.compress(text.encode('UTF-8'))

In [5]: type(compressed)
Out[5]: bytes

In [6]: %timeit zlib.decompress(bytes(compressed))
10000 loops, best of 3: 121 µs per loop

问题似乎出在您的环境中。可能性是;

  • 内存不足导致交换。
  • 类 UNIX 操作系统上的用户限制设置得太低。
  • CPU 速度慢。

您必须提供有关您的环境的更多信息。

【讨论】:

  • 那么,你的答案是什么?
【解决方案2】:

是因为在最后一行str(decompressed),您正在构建二进制字符串的“可读”表示。这个过程很慢而且很耗内存。

一个例子:

>>> b = bytes(range(256))
>>> len(b)
256
>>> len(str(b))
738
>>> 

用大字符串试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2011-09-23
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多