/ / pythonでビッグデータを圧縮する際の問題 - python、zlib

pythonで大きなデータを圧縮する際の問題 - python、zlib

私はPythonで大きな文字列を圧縮するためのスクリプトを持っています。

import zlib

def processFiles():
...
s = """Large string more than 2Gb"""
data = zlib.compress(s)
...

このスクリプトを実行すると、エラーが発生しました。

ERROR: Traceback (most recent call last):#012  File "./../commands/sce.py", line 438, in processFiles#012    data = zlib.compress(s)#012OverflowError: size does not fit in an int

いくつかの情報:

zlibバージョン = "1.0"

zlib.ZLIB_VERSION = "1.2.7"

# python -V
Python 2.7.3

# uname -a
Linux app2 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux

# free
total       used       free     shared    buffers     cached
Mem:      65997404    8096588   57900816          0     184260    7212252
-/+ buffers/cache:     700076   65297328
Swap:     35562236          0   35562236

# ldconfig -p | grep python
libpython2.7.so.1.0 (libc6,x86-64) => /usr/lib/libpython2.7.so.1.0
libpython2.7.so (libc6,x86-64) => /usr/lib/libpython2.7.so

Pythonでビッグデータ(2Gb以上)を圧縮するにはどうすればいいですか?

回答:

回答№1は1

これはRAMの問題ではありません。単にzlibまたはpythonバインディングは4GBを超えるデータを扱うことができません。

データを4GB(またはそれより小さなチャンク)に分割し、それぞれを別々に処理します。


回答№2の場合は3

大きなデータを圧縮するための私の機能:

def compressData(self, s):
compressed = ""
begin = 0
blockSize = 1073741824 # 1Gb
compressor = zlib.compressobj()
while begin < len(s):
compressed = compressed + compressor.compress(s[begin:begin + blockSize])
begin = begin + blockSize
compressed = compressed + compressor.flush()
return compressed

回答№3の場合は0

ストリーミングしてみてください...

import zlib

compressor = zlib.compressobj()
with open("/var/log/syslog") as inputfile:
data = compressor.compress(inputfile.read())

print data