임의로 큰 사전을 만들 수 있는 압축 도구가 있습니까?

임의로 큰 사전을 만들 수 있는 압축 도구가 있습니까?

저는 임의로 큰 사전(및 "블록 크기")을 갖춘 압축 도구를 찾고 있습니다. 예를 들어 설명하겠습니다.

먼저 32MB의 임의 데이터를 생성한 다음 이를 자체적으로 연결하여 64MB의 두 배 길이의 파일을 형성해 보겠습니다.

head -c32M /dev/urandom > test32.bin
cat test32.bin test32.bin > test64.bin

물론 랜덤이기 때문에 test32.bin비압축 이지만 전반부 test64.bin는 후반부와 동일하므로 50% 정도 압축 가능해야 합니다.

먼저 몇 가지 표준 도구를 사용해 보겠습니다. test64.bin의 크기는 정확히 67108864입니다.

  • gzip -9. 압축 크기 67119133.
  • bzip2-9. 압축된 크기는 67409123입니다. (정말 엄청난 비용이군요!)
  • xz-7. 압축된 크기는 67112252입니다.
  • xz-8. 압축된 크기는 33561724입니다.
  • zstd - 슈퍼 -22. 압축된 크기는 33558039입니다.

이를 통해 우리는 gzip과 bzip2가 파일을 압축할 수 없다는 것을 알게 됩니다. 그러나 xz 및 zstd는 사전이 충분히 큰 경우 파일을 압축할 수 있으며, 이 경우 zstd가 가장 잘 작동합니다.

하지만 지금 시도해 보세요.

head -c150M /dev/urandom > test150.bin
cat test150.bin test150.bin > test300.bin

test300.bin의 크기는 정확히 314572800입니다. 가장 높은 설정에서 최상의 압축 알고리즘을 다시 시도해 보겠습니다.

  • xz-9. 압축 사이즈 314588440
  • zstd - 슈퍼 -22. 압축 크기 314580017

이 경우 두 도구 모두 파일을 압축할 수 없습니다.

test300.bin과 같은 파일을 압축할 수 있도록 임의로 큰 사전 크기를 가진 도구가 있습니까?


의견과 답변에 감사드립니다. zstd와 xz 모두 가능하다는 것이 밝혀졌습니다. 하지만 zstd 버전 1.4.x가 필요합니다.

  • zstd --long=28. 압축 사이즈 157306814
  • xz -9 --lzma2=dict=150MiB. 압축된 크기는 157317764입니다.

답변1

적어도 다음과 같이 작동할 수 있습니다.xz주문하다. 맨 xz페이지는 다음과 같습니다.

다음 표에는 사전 설정된 기능이 요약되어 있습니다.

Preset    DictSize    CompCPU     CompMem     DecMem
    -0    256 KiB        0          3 MiB      1 MiB

[...]

    -9     64 MiB        6        674 MiB     65 MiB

열 설명:

DictSize는 LZMA2 사전 크기입니다.. 압축되지 않은 파일 크기보다 큰 사전을 사용하면 메모리가 낭비됩니다. 그렇기 때문에 필요하지 않을 때는 사전 설정 -7~9를 사용하지 않는 것이 가장 좋습니다. [...]

문서화 된대로맞춤형 압축기 필터 체인xz예를 들어 사전 크기를 수동으로 간단히 제공할 수 있습니다. --lzma2=dict=150MiB150MiB이면 충분하다는 것을 알고 있습니다. 그렇지 않으면 파일 크기를 사용해야 합니다.

xz -9 --lzma2=dict=150MiB test300.bin

이 작업을 수행하는 동안 xzamd64의 프로세스는 대부분의 경우 최대 1.6g의 상주 메모리 사용량을 유지했습니다.

$ ls -l test*
-rw-r--r--. 1 user user 157286400 Jan 19 16:03 test150.bin
-rw-r--r--. 1 user user 157317764 Jan 19 16:03 test300.bin.xz

관련 정보