2011-11-23 2 views
1

pythons bz2compressor 클래스를 사용하여 데이터 스트림을 압축하려고합니다.Python BZ2 압축기 - 아무것도 반환하지 않습니다.

문서는 bz2compressor.compress()가 압축 된 데이터의 덩어리를 반환해야 "가능한"하지만 난 아무것도

을하지 않습니다 말한다 내 모든 압축 된 데이터 I flush() (I 파일 2기가바이트 +로 시도) 아직 아무것도 얻을.

데이터를 반환해야하는 경우 내부 버퍼 제한을 설정할 수있는 방법이 있습니까?

감사합니다.

+0

"플러시() (파일 2GB 이상을 시도했지만) 여전히 아무것도 압축되지 않은 데이터를 얻습니다." 이것은 무엇을 의미 하는가? 당신은 플러시와 함께 데이터를 얻을 수 있습니까? 그렇다면 귀하의 질문은 무엇입니까? 왜 실제로 청크를 반환하지 않는지 궁금하십니까? –

+0

안녕하세요, 예, bz2compressor.compress()의 작은 덩어리를 원합니다 (문서에서이 함수가 척을 반환한다고 말합니다) –

+0

청크를 반환하는 데 * 반드시 필요한 것은 아닙니다. 구현은 필요하지 않습니다. 컴퓨터에 너무 많은 메모리가있는 것처럼 보입니다. –

답변

2

플러시() (파일 2GB 이상을 시도했지만)가 전혀 압축되지 않은 데이터를 얻습니다.

압축기 작업에는 트릭이 있습니다.

귀하의 2GB + 파일이 임의적이지는 않았을 것입니다. 무작위 데이터가 잘 압축되지 않습니다. 질서 정연한 데이터는 매우 작은 크기로 압축됩니다.

>>> import bz2 
>>> c=bz2.BZ2Compressor() 
>>> import string 
>>> data = string.printable*1024 
>>> len(data) 
102400 
>>> c.compress(data) 
'' 
>>> result= c.flush() 
>>> len(result) 
361 

데이터가 공급되고, 예를 들어

는 잘 압축 이루어지는 패턴을 가졌다.

임의의 데이터가 필요합니다.

>>> import random 
>>> c=bz2.BZ2Compressor() 
>>> size= 0 
>>> result= '' 
>>> while result == '': 
...  data = ''.join(random.choice(string.printable) for i in xrange(1024*8)) 
...  size += len(data) 
...  result= c.compress(data)... 
>>> len(result) 
754809 
>>> size 
901120 

정말 무작위 데이터를 사용할 때 청크가납니다.