저는 임의로 큰 사전(및 "블록 크기")을 갖춘 압축 도구를 찾고 있습니다. 예를 들어 설명하겠습니다.
먼저 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=150MiB
150MiB이면 충분하다는 것을 알고 있습니다. 그렇지 않으면 파일 크기를 사용해야 합니다.
xz -9 --lzma2=dict=150MiB test300.bin
이 작업을 수행하는 동안 xz
amd64의 프로세스는 대부분의 경우 최대 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