2017-09-19 12 views
5

나는 pythons bz2 모듈을 사용하여 큰 jsonl 파일 (bzip2 압축 17GB)을 생성 (압축)합니다.bz2의 압축 해제를 병렬화 할 수 있습니까?

그러나 나중에 pbzip2를 사용하여 압축을 풀려고하면 CPU 코어를 사용하는 것으로 보이는데 이는 상당히 느립니다.

내가 pbzip2로 압축하면 압축 해제시 여러 코어를 활용할 수 있습니다. 파이썬에서 pbzip2 호환 형식으로 압축하는 방법이 있습니까?

import bz2,sys 
from Queue import Empty 
#... 
compressor = bz2.BZ2Compressor(9) 
f = open(path, 'a') 

    try: 
     while 1: 
      m = queue.get(True, 1*60) 
      f.write(compressor.compress(m+"\n")) 
    except Empty, e: 
     pass 
    except Exception as e: 
     traceback.print_exc() 
    finally: 
     sys.stderr.write("flushing") 
     f.write(compressor.flush()) 
     f.close() 
+0

내가 디스크 I/O를 병렬화하는 것을 읽은 것은 [나쁜 생각] (https://stackoverflow.com/a/1993707/3727854)입니다. 이 질문에 [이 답변은 관련이있을 수 있습니다.] (https://stackoverflow.com/a/42012661/3727854)라고합니다. –

+1

@JamesDraper 디스크 입출력은 제한 요소가되지 않습니다 ... bzip 계산 속도가 느립니다. – o11c

+1

@worenga jsonl은 절삭하기 쉽기 때문에 최상위 숫자를 사용하는 경우 위험한 형식입니다. Json-seq은 오류를 명령하여 문제를 해결합니다. – o11c

답변

2

pbzip2 스트림은 여러 bzip2 스트림의 연결에 지나지 않는다.

쉘 사용

예 :

bzip2 </usr/share/dict/words> words_x_1.bz2 
cat words_x_1.bz2{,,,,,,,,,} > words_x_10.bz2 
time bzip2 -d <words_x_10.bz2> /dev/null 
time pbzip2 -d <words_x_10.bz2> /dev/null 

내가 파이썬의 bz2 모듈을 사용한 적이을하지만 'a' ppend 모드에서 스트림을 다시 열/닫 쉬워야한다, 모든 너무-바이트는 얻을 수 같은 결과. BZ2File이 기존의 파일과 유사한 객체로 구성되면 BZ2File을 닫으면 기본 스트림이 닫히지 않습니다 (여기에서 원하는 내용).

청킹에 적합한 바이트 수를 측정하지는 않았지만 1-20 메가 바이트마다 추측 할 수 있습니다. 확실히 bzip2 블록 크기 (900k)보다 커야합니다.

각 청크의 압축 및 압축 해제 오프셋을 기록하면 상당히 효율적인 임의 액세스를 수행 할 수 있습니다. 이것은 dictzip 프로그램이 작동하는 방식이지만, gzip을 기반으로합니다.