2017-03-17 15 views
3

Big file compression with python은 어떻게 사용하는지에 대한 아주 좋은 예를 보여줍니다. bz2는 순전히 파이썬에서 매우 큰 파일 세트 (또는 큰 파일)를 압축합니다.Python을 사용하여 병렬 gzip 압축을 수행하는 방법은 무엇입니까?

pigz은 병렬 압축을 사용하면 더 잘할 수 있다고 말합니다. 내 지식 (및 Google 검색)에서 순수 파이썬 코드에서 파이썬과 동일한 기능을 찾을 수 없습니다.

pigz 또는 동급의 병렬 파이썬 구현이 있습니까?

+0

표준 라이브러리의 압축 모듈은 * pure python *이 아닙니다. 살펴 본다면 공유 라이브러리 (C로 작성된)에 대한 인터페이스임을 알 수 있습니다. –

+2

그리고 이제는 'gzip'을 퇴역시킬 때입니다. 새로운'zstd' 압축은 gzip보다 [일반적으로 더 빠릅니다.] (http://rsmith.home.xs4all.nl/miscellaneous/evaluating-zstandard-compression.html) 작은 압축 파일을 만듭니다. –

+1

@RolandSmith : 물론, 파이썬 인터페이스도 없다. 'gzip'보다 빠르지 만, 더 빨리 압축 할 수있는 옵션이 많이 있습니다. 'gzip'은 호환성 문제로 인해 적어도 부분적으로 고수합니다; 10 년이 넘은 하드웨어/소프트웨어가있는 시스템에서 압축을 풀 수 있으며 기본적으로 설치되어있을 것입니다 ('bz2'는 거의 널리 보급되어 있으며,'xz'가 거기에 도달하고 있습니다). 데이터를 여러 당사자에게 배포하려면 이동성과 압축률이 속도보다 중요합니다. 일시적인 압축의 경우 속도가 압축률보다 높기 때문에 'lz4'또는 'lzo'가 'zstd'를 초과 할 수 있습니다. – ShadowRanger

답변

4

저는 파이썬을위한 pigz 인터페이스에 대해 잘 모릅니다.하지만 정말로 필요한 경우 쓰기가 어렵지 않을 수 있습니다. Python's zlib module은 임의의 청크를 압축 할 수 있으며, the pigz man page은 이미 압축 및 출력 형식을 병렬화하기위한 시스템을 설명합니다.

당신이 정말로 병렬 압축을해야 할 경우 대규모 IPC 비용이 발생하지 않을 수 있도록, a는 multiprocessing API의 스레드 백업 버전 multiprocessing.dummy.Pool.imap (multiprocessing.dummy에 싸여 덩어리를 압축 zlib를 사용하여 해당 pigz입니다 구현할 수 있어야한다 청크를 직원들에게 보내거나 직원들로부터 청크를 보내어) 압축을 병렬화합니다. zlib은 CPU 바운드 작업 중 GIL을 해제하는 몇 가지 기본 제공 모듈 중 하나이므로 스레드 기반 병렬 처리의 이점을 실제로 누릴 수 있습니다.

실제적으로 압축 수준이 그만큼 높지 않으면 I/O는 종종 실제 압축과 비슷한 (대략 크기 정도) 비용입니다. 데이터 소스가 실제로 압축하는 것보다 빠르게 스레드를 공급할 수없는 경우 병렬 처리를 많이하지 않을 것입니다.

+0

청크를 작업자에게 보낼 필요가 없습니다. 각 작업자가 파일에서 자체 청크를 읽게하십시오. 또는 UNIX에서 풀을 만들기 전에 입력 *에 대한 메모리 매핑 파일을 만들 수 있습니다. OS의 가상 메모리 시스템은 입력 파일의 페이지를 메모리에 유지하기 위해 대부분의 작업을 수행합니다. –

+0

@RolandSmith : True. 나는 모든 것들에 대해'mmap '에 대한 열렬한 팬이다. 그리고'zlib.compress'는 버퍼 프로토콜 친화적이다 (즉, 데이터 복사를 피하기 위해'mmap'의'memoryview'에서 읽을 수있다.). 당신은 여전히 ​​imap을 사용하여 블록을 잡아 당기고 출력을 구성 할 수 있습니다 (압축 된 블록의 크기는 미리 추측 할 수 없기 때문에 쓰기를 직렬화 할 수도 있습니다). – ShadowRanger

+0

조정에 관해서는 각 128KB 블록의 시작에 대한 바이트 오프셋 목록을 만들고 그 위에 'imap'을 작성합니다. 출력에 관해서는, 나는 아마 각각의 압축 된 블록을 임시 출력 파일에 기록하고 나중에 연결시킬 것이다. 아니면'mmap'을 시도해보십시오. 상위 프로세스로 다시 전달하면 부차적 인 것으로 느껴집니다. –

2

Z_SYNC_FLUSH과 함께 flush() 연산을 사용하여 마지막 수축 블록을 완성하고 바이트 경계에서 끝낼 수 있습니다. 연결 한 마지막 스트림이 Z_FINISH (이는 flush()의 기본값 임)으로 플러시되는 한 유효한 스트림을 만들기 위해 이들을 연결할 수 있습니다.

병렬로 CRC-32를 계산할 수도 있습니다 (zip 또는 gzip 용 - 실제로 병렬 gzip 압축이라고 생각합니다). 파이썬은 zlib의 crc32_combine() 함수에 대한 인터페이스를 제공하지 않습니다. 그러나 zlib에서 코드를 복사하여 Python으로 변환 할 수 있습니다. 그렇게 빨리 달릴 필요가 없기 때문에 그렇게 빨리 될 것입니다. 또한 테이블을 미리 만들어서 빨리 작성하거나 고정 된 블록 길이의 행렬을 미리 작성할 수도 있습니다.