많은 유사한 큰 파일을 압축


18

압축하려는 수백 개의 유사한 큰 파일 (각각 30MB)이 있습니다. 모든 파일 쌍에는 동일한 데이터의 99 % (1 % 미만)가 있으므로 40-50MB를 초과하지 않을 것으로 예상됩니다.

단일 파일 (와 13~15메가바이트에 30메가바이트에서 압축 할 수 있습니다 xz -1, gz -1, bzip2 -1)하지만, 두 개 이상의 파일을 압축 할 때 나는 크기와 아카이브를 갖고 싶어 13-15MB + N*0.3MBN 파일의 번호입니다.

사용하는 경우 tar(고체 아카이브를 만드는)와 xz -6(- 압축 사전보다 더 큰 하나 개의 파일에 정의 업데이트 -!이 충분하지 않았다 ), 나는 아직도 크기 아카이브가 N*13MB.

나는 그 모두를 생각 gzip하고 bzip2그들이 사전 1MB 미만을 가지고 있기 때문에 나에게 도움이되지 않습니다, 내 타르 스트림은 반복을 매 30 MB 있습니다.

표준 도구를 사용하여 최신 Linux에서 내 문제를 어떻게 보관할 수 있습니까?

xz빠르게 압축 하도록 조정할 수 있지만 30-60MB보다 큰 사전을 사용할 수 있습니까?

업데이트 :와 트릭을했다 tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz. 필수 mf=hc4--memory=2G옵션 에 대해 잘 모르겠습니다 . 그러나 dict=128M사전을 하나의 파일보다 큰 것으로 충분히 크게 mode=fast설정하고 프로세스를보다 빠르게 만듭니다 -e.


실행 xz -1 --memory=2G이 도움이되지 않아 세트에서 2 및 4 파일을 테스트했습니다.
osgx

답변:


12

귀하의 세부 사항을 고려할 때 파일에 실제로 99 %의 공통 데이터가 있고 연속 (또는 거의 연속) 차이가 1 % 있음을 확인했다고 가정합니다.

먼저 tar를 사용하여 파일이 들어있는 하나의 아카이브를 만들어야합니다. 테스트를 위해 파일이 10 개인 .tar를 만들어 300MB 크기로 만듭니다.

그런 다음 xz를 사용하여 사전이 한 파일의 크기보다 크도록 설정해야합니다. 메모리 제한이 있는지 말하지 않기 때문에 xz -9를 사용합니다. 사용 가능한 모든 메모리를 사용하지 않을 필요는 없습니다.

또한 --extreme 사전 설정을 사용하여 차이가 있는지 테스트합니다.

사전 크기

내가 사용할 수있는 한 문서- 사이트 -에서 사전 크기는 압축 해제 기 메모리 사용량과 거의 동일하다고합니다. -1 매개 변수는 1MiB의 dict를, -6은 10MiB (또는 동일한 매뉴얼의 다른 부분에서 8MiB)를 의미합니다. 그렇기 때문에 파일을 함께 압축하여 이점을 얻지 못하는 이유입니다. -9를 사용하면 decompessor (및 사전)가 64MiB가되므로 원하는 것입니다.

편집하다

또 다른 가능성은 다른 압축기를 사용하는 것입니다. 나는 7zip으로 갈 것이지만, 먼저 그 파일들을 tar 한 다음 7zip으로 압축 할 것이다.

파일 내용에 따라 PPM-D 방법으로 7zip을 사용할 수 있습니다 (LZMA 또는 LZMA2 대신 xz에서 사용되는 것과 동일)

좋지 않음 : Zip (dict = 32kB), Bzip (dict = 900kB).


Xz와 7-Zip은 모두 LZMA2를 사용하므로 아무런 이점이 없습니다. PPMD는 이미 압축 된 미디어 (예 : MP3 및 비디오)에서 매우 느리지 만 압축률이 높은 엔트로피 추출에 최적화되어 있습니다. 특히 두 파일 사이의 큰 유사점을 찾아서 LZMA2보다 더 큰 사전에 저장하지는 않습니다.
allquixotic

woliveirajr, 사용하지 -1않거나 -9사전 설정을 사용하지만 지정 dict=64MB하거나 dict=128MB설정하는 것은 mode=fast어떻습니까?
osgx

-1 또는 -9 대신 dict = xxMB를 사용하면 문제가 해결되지만 -9를 사용할 때 xz가 다른 매개 변수를 설정하는 방법을 모르기 때문에 무언가를 놓치지 않을지 모르겠습니다. 그밖에. 나는 당신이 올바른 방향에 있다고 생각하고 테스트 만하면 정확한 대답을 줄 것입니다.
woliveirajr

3
xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G저는 18 메가 바이트 tar.xz 아카이브에 250 개 파일 (7.5 GB)를 압축 할 수 있었다.
osgx

@osgx :) 꽤 좋습니다. 시간이 너무 오래 걸리지 않으면 (즉, 필요한 시간 내에) 문제가 해결되었습니다! :) 그래서 final_size = 13MB + x * 6kB를 얻었습니다.
woliveirajr

9

만약 그들이 말한 것과 99 % 유사 하다면 , bsdiff 또는 유사한 알고리즘을 사용하여 파일들 사이의 차이를 계산할 수 있어야 합니다. 차이가 누적 됩니까 (즉, 각 파일이 첫 번째 파일과 조금 더 다름) 두 파일 간의 차이가 거의 동일합니까?

누적되지 않은 경우 다음을 수행 할 수 있어야합니다.

  • 임의의 파일을 "기준선"으로 사용
  • bsdiff기준 파일을 각 추가 파일과 비교하여 실행
  • 기준 파일과 함께 각 diff를 별도의 파일로 저장
  • xz결과 (기준선 + diffs) 와 같은 방식으로 압축기를 실행하십시오 .

결과는 xz전체 아카이브를 처리하는 것보다 훨씬 작아야 합니다.

그런 다음 기준선 위에 diff를 "적용"하여 원본 파일을 "재구성"하여 다른 파일을 각각 가져올 수 있습니다.


누적되지 않습니다. ( "모든 파일 쌍에는 동일한 데이터의 99 %가 있습니다 ...")
osgx

1
차이가 누적되지 않으면 bsdiff알고리즘을 적용하는 것이 좋습니다 . 시도 해봐.
allquixotic

귀하의 답변에 감사드립니다.하지만 이미 xz로 작업을 수행하고 tar c directory|xz --lzma2=dict=128M,mode=fast입력 파일을 삭제했습니다. 실제로 내 입력 파일은 텍스트이므로 bsdiffPC에 설치되지 않은 대신 diff를 사용할 수도 있습니다 .
osgx

5

귀하 (I)는 rzip 또는 lrzip ( Readme ) 과 같이 장거리 패턴 감지가 가능한 일부 아카이버와 함께 tar를 사용할 수 있습니다 . 둘 다 장거리 중복 감지 / 중복 제거를 사용하고 rzip은 bzip2를 사용하고 lrzip은 xz (lzma) / ZPAQ을 사용합니다.

rzip은 gzip 또는 bzip2와 기능이 비슷하지만 파일에서 장거리 중복을 활용할 수있는 압축 프로그램으로 rzip이 다른 프로그램보다 압축률을 훨씬 향상시킬 수 있습니다. ... rzip의 주요 장점은 900MB의 유효 히스토리 버퍼를 가지고 있다는 것입니다. 즉, 일반적으로 사용되는 다른 압축 프로그램과 비교할 때 엄청난 거리에서 입력 파일의 일치하는 부분을 찾을 수 있습니다. 비교하여 gzip 프로그램은 32KB의 히스토리 버퍼를 사용하고 bzip2는 900KB의 히스토리 버퍼를 사용합니다.

lrzip은 더 큰 버퍼를 가지며 중복 제거 후 많은 압축 알고리즘 (매우 빠르고 빠르며 양호하며 최고 중 하나 인 ZPAQ)을 사용할 수 있습니다.

Lrzip은 확장 된 버전의 rzip을 사용하여 첫 번째 장거리 중복 감소를 수행합니다. lrzip 수정은 메모리 크기에 따라 확장됩니다.

데이터는 다음 중 하나입니다. 1. lzma (기본)로 압축하여 bzip2 압축 속도의 약 2 배로 뛰어난 압축률을 제공합니다 ...

다른 방법은 git packfile을 기반으로 블록 / 세그먼트 수준 중복 제거 기능이있는 bup- 백업 프로그램을 사용하는 것입니다 .

롤링 체크섬 알고리즘 (rsync와 유사)을 사용하여 큰 파일을 청크로 분할합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.