다른 "압축"시스템의 차이점은 무엇입니까?


9

압축에는 항상 TAR과 ZIP을 사용했지만 최근에는 *.Z압축 알고리즘 에 대해 들었습니다 . 이것은 나에게 질문을 주었다.

이러한 모든 압축 시스템에서 일반적인 사용 및 압축에 가장 적합한 시스템은 무엇입니까?

몇 가지 테스트를 실행하면서 발견 tar한대로 명시 적으로 지정하지 않는 한 실제로 압축되지 않는 것을 발견했습니다. 다른 압축 방법과 비교하여 좋은 점은 무엇입니까?

나는 ZIP 가장 널리 사용되는 압축 시스템임을 이미 알고,하지만 난 그것을 대신 사용한다 *.Z, *.7z, .tar, 또는 .tar.<insert ending here>?

게시물 요약 :

  1. 내가 사용해야 *.tar, *.Z, *.7z, .tar, 또는 .tar.<insert ending here>최고의 압축?
  2. 평원 *.tar이 압축되지 않으면 왜 우리는 그것을 사용합니까?

편집 : 모든 알고리즘이 Linux 권한 저장을 허용하지는 않습니다 (내가 배운 것부터). 권한을 저장하는 데 사용할 수있는 일종의 해킹 (또는 스크립트)이 있습니까?


그런 말을 할 필요가 없습니다. 최고 투표 한 사람 중 하나를 선택하거나 가장 도움이되는 것을 선택하십시오.)
Seth

답변:


17

tar테이프 아카이브를 나타냅니다. 테이프 드라이브 (또는 파일)에 저장하고 나중에 복원 할 수있는 바이트 스트림으로 파일과 메타 데이터 (권한, 소유권 등)를 압축하기 만하면됩니다. 압축은 원하는 경우 압축하기 위해 외부 유틸리티를 통해 출력을 파이프하는 데 사용했던 완전히 별개의 문제입니다. GNU tar는 적절한 유틸리티를 통해 출력을 바로 가기로 자동 필터링하도록 스위치를 추가하기에 충분했습니다.

Zip과 7z는 보관 및 압축을 자체 컨테이너 형식으로 결합하며 DOS / Windows 시스템에 파일을 압축하여 유닉스 권한과 소유권을 저장하지 않습니다. 따라서 적절한 백업에 대한 권한을 저장하려면 tar를 사용해야합니다. Windows 사용자와 파일을 교환하려는 경우 zip 또는 7z가 좋습니다. 실제 압축 알고리즘 zip 및 7zip 사용은 각각 uzing gzip및 tar를 사용하여 tar와 함께 사용할 수 있습니다 lzma.

lzma (일명 * .xz)는 최고의 압축 비율 중 하나이며 압축 해제 속도가 매우 빠르므로 요즘 최고의 선택입니다. 그러나 압축하려면 엄청난 양의 램과 CPU 시간이 필요합니다. 독창적 인 gzip압축은 압축 속도가 약간 빠르므로 CPU 시간을 많이 사용하지 않으려는 경우 사용할 수 있습니다. 또한 lzop이라는 훨씬 더 빠른 변형이 있습니다. bzip2압축률이 더 높기 때문에 7zip / lzma가 등장하기 전까지 gzip을 대체 한 것으로 여전히 인기가 있지만, 7z / lzma가 압축 해제 속도가 빠르고 압축률이 높아지면서 요즘 인기가 떨어집니다. compress일반적으로 파일 이름을 * .Z로 지정하는 이 유틸리티는 오래되었고 오랫동안 잊혀졌습니다.

zip과 tar의 다른 중요한 차이점 중 하나는 zip이 작은 청크로 데이터를 압축하는 반면 tar 파일을 압축하면 전체를 한 번에 압축한다는 것입니다. 후자는 더 나은 압축 비율을 제공하지만 아카이브의 끝에서 단일 파일을 추출하려면 전체 파일을 압축 해제하여 압축을 풀어야합니다. 따라서 zip 형식은 큰 아카이브에서 단일 파일을 추출 할 때 더 좋습니다. 7z를 dar사용하면 전체 ( "고체"모드라고 함) 또는 작은 덩어리를 압축하여 조각을 쉽게 추출 할 수 있습니다.


그러나 TAR 만 메타 데이터를 지원합니까? 또는 gzip / bzip2도 메타 데이터를 지원합니다
Kaz Wolfe

@pacificfils, 압축 유틸리티는 메타 데이터없이 단일 파일 만 압축합니다.
psusi

하나의 폴더를 압축 한 다음 압축 파일에 넣고 권한을 유지할 수 있습니까?
Kaz Wolfe

@pacificfils, 그렇습니다.하지만 zip의 이점과 압축률이 더 좋기 때문에 약간 어리 석습니다 gzip.
psusi

@pacificfils tar cfp는 권한을 유지합니다. tar 파일은 압축되지 않으므로 zip (7-zip), gzip2, gzip, lzo 등은 모두 tar 파일을 잘 압축합니다 (일반적으로 압축 파일의 tar는 압축 할 수 없음).
Elliott Frisch

9

알고리즘의 세부 사항은 여기에 주제와 있습니다 (1) 가 리눅스에 어떤 방식으로 특정하지 않기 때문에 혼자 우분투를 보자. 그러나 여기서 좋은 정보를 찾을 수 있습니다 .

지금에 tar당신이 말한대로, tar압축 프로그램 없었다되지 않고 않습니다. 대신, 아카이버입니다 . 주요 목적은 많은 작은 파일에서 하나의 큰 파일을 만드는 것입니다. 역사적으로 이것은 테이프 드라이브에 저장을 용이하게하기위한 것이므로 이름은 Tape ARchive입니다.

오늘날 사용하는 주요 이유 tar는 시스템의 파일 수를 줄이는 것입니다. Unix 파일 시스템의 각 파일은 inode를 차지하고 파일 수가 많을수록 사용 가능한 inode 수가 적고 inode가 부족하면 더 이상 새 파일을 만들 수 없습니다. 간단히 말해, 수천 개의 파일로 저장된 동일한 양의 데이터는 단일 tar 아카이브의 동일한 파일보다 많은 하드 드라이브를 차지합니다.

설명을 위해, 이것은 68G /파티션 에 대한 의견에서 논쟁을 거쳤기 때문에 다음과 같은 총 수의 inode와 사용 된 inode를 가지고 있습니다 (inode 수는 파일 시스템 유형과 파티션 크기에 달려 있음을 명심하십시오).

Inode count:              393216
Free inodes:              171421

이제 inode보다 더 많은 파일을 만들려고하면 :

$ touch {1..171422}
touch: cannot touch ‘171388’: No space left on device
touch: cannot touch ‘171389’: No space left on device
touch: cannot touch ‘171390’: No space left on device
touch: cannot touch ‘171391’: No space left on device
touch: cannot touch ‘171392’: No space left on device
touch: cannot touch ‘171393’: No space left on device
touch: cannot touch ‘171394’: No space left on device
touch: cannot touch ‘171395’: No space left on device
touch: cannot touch ‘171396’: No space left on device
touch: cannot touch ‘171397’: No space left on device

공간 없음? 그러나 나는 많은 공간을 가지고있다 :

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5,8G  4,3G  1,2G  79% /

위에서 볼 수 있듯이, 수십만 개의 빈 파일을 만들면 내 inode가 빠르게 고갈되고 더 이상 새 파일을 만들 수 없습니다. 내가 이것 tar들이라면 파일을 다시 만들 수 있습니다.

파일 수가 적을수록 특히 NFS 마운트 파일 시스템에서 파일 시스템 I / O 속도가 크게 향상됩니다. 파일이 적을수록 더 빠른 프로그램 find이 작동하기 때문에 프로젝트가 완료되면 항상 이전 작업 디렉토리를 tar로 만듭니다.

거기에있다 훌륭한 대답은 훨씬 더 많은 내용이수록되어 슈퍼 사용자에 대한,하지만 위뿐만 아니라, 왜 다른 기본적인 이유는 tar오늘날 여전히 인기가 있습니다 :

  1. 효율성 : 중간 파일을 만들지 않기 때문에 tar압축 프로그램을 통해 파이프를 사용 하는 gzip것이 더 효율적입니다.

  2. tar 모든 종류의 종소리와 휘파람과 함께 제공됩니다. 오래 동안 오랜 기간 동안 설계된 기능으로 * nix 백업 (권한, 파일 소유권, STDOUT으로 데이터를 직접 파이프하는 기능 및 SSH 링크를 통해 생각하는 기능)에 특히 유용합니다. )

  3. 관성. 우리는 익숙합니다 tar. 사용 가능한 모든 * nix에서 사용할 수 있다고 가정하는 것이 안전하므로 소스 코드 타르볼에 매우 이식 가능하고 편리합니다.


1 이것은 절대적으로 사실이며 설명하기에 충분하지 않다는 사실과 관련이 없습니다. :)


3
내 컴퓨터에는 과거에 10,000,000 개가 넘는 파일이 있었지만 실제로 그렇게 크지는 않습니다. tar대부분의 파일 시스템은 솔직히 신경 쓰지 않기 때문에 "파일 수를 줄이는 데" 사용 하지 않으며, tar파일에 대한 쉬운 임의 액세스를 지원하지 않기 때문에 실제로 최적 은 아닙니다. 오히려 (주로 저는 대부분의 사람들에게) 주된 용도는 간단한 방법으로 다른 사람들과 파일 (예 : 소스 코드)을 공유하는 것입니다.
nneonneo

@nneonneo 단일 디렉토리 에서 수백만 개의 파일로 작업 한 적이 있습니까? 나는 쉽지 않다고 생각합니다. 의 명백한 문제와는 별개로 ARG_MAX, 이렇게하면 파일을 처리하는 데 어려움을 겪을 수 있으며 실제로 파일이 중앙 서버에 저장되고 NFS와 무릎을 꿇고 공유되는 (잘못된) 설정 네트워크를 가져올 수 있습니다. 전체 파일 수를 줄이려면 알 수있는 것보다 더 많은 파일이 필요하지만 다중 사용자 설정에서는 실제로 inode 수가 제한 될 수 있습니다.
terdon

@nneonneo tune2fs -l는 $ HOME을 보유한 파티션에 19,300,352 개의 inode가 있다고 알려줍니다. 그보다 더 많은 파일을 만들 수 없습니다. 당신이 말했듯이, 10 ^ 6은 더 높은 범위조차도 미쳤지 않습니다. 당신이하고있는 일에 따라 그 이상의 방법 이 필요할 수 있습니다 .
terdon

@nneonneo는 inode가 쉽게 소진 될 수있는 방법에 대한 실제 예를 보려면 업데이트 된 답변을 참조하십시오.
terdon

내 서버는 백만 개 이상의 inode를 사용하고 있으며 이는 메트릭 톤의 전자 메일 (많은 트래픽이 많은 메일 링리스트가 몇 년 동안 되돌아오고 있음)을 가지고 Maildir 형식으로 저장하기 때문입니다. 나는 1 천 9 백만 개의 inode를 사용하기 위해 무엇을 할 수 있는지 전혀 모른다. 7 개월 동안 하루 24 시간마다 새로운 파일을 작성해야합니다.
psusi

4

별개의 두 가지 관련 작업이 있습니다. 파일 트리 (파일 이름, 디렉토리 구조, 파일 시스템 권한, 소유권 및 기타 메타 데이터 포함)를 바이트 스트림으로 압축하는 것을 보관 이라고 합니다. 더 작은 바이트 스트림을 생성하기 위해 바이트 스트림에서 중복성을 제거하는 것을 압축 이라고 합니다.

유닉스에서는 두 가지 작업이 각각 별개의 도구로 분리되어 있습니다. 대부분의 다른 플랫폼 (현재 및 과거)에서 결합 된 도구는 보관 및 압축을 모두 수행합니다.

gzip의 인터페이스를 모방 한 gzip 및 기타 프로그램에는 압축 된 출력에 원래 파일 이름을 저장하는 옵션이 있지만 CRC 또는 손상을 감지하기위한 기타 검사와 함께 이들이 저장할 수있는 유일한 메타 데이터입니다.

압축을 아카이브와 분리하면 이점이 있습니다. 아카이빙은 플랫폼에 따라 다르지만 (보존이 필요한 파일 시스템 메타 데이터는 매우 다양 함) 구현은 간단하고 대부분 I / O 바운드이며 시간이 지남에 따라 거의 변경되지 않습니다. 압축은 플랫폼에 독립적이지만 구현은 CPU 바운드이며 최신 하드웨어가 문제를 해결할 수있는 증가 된 리소스를 활용하기 위해 알고리즘이 지속적으로 개선되고 있습니다.

가장 인기있는 유닉스 아카이버는 tar이 같은 다른 사람을 존재하지만, cpio하고 ar. (데비안 패키지는 ar아카이브이며, cpio종종 램 디스크에 사용됩니다.) 가장 오래된 것에서 가장 어린 것까지 (.Z), (.gz), (.bz2) 및 (.xz) 와 tar같은 압축 도구와 결합되거나 결합 된 경우가 많습니다 . 최악의 압축에서 최상의 압축으로의 우연이 아닙니다.compressgzipbzip2xz

메이킹 tar아카이브를하고 압축은 별개의 단계는 다음과 같습니다 압축기가에 대해 아무것도 모르는 tar파일 형식을. 즉, 압축 된 tar아카이브 에서 단일 파일을 추출 하려면 이전 파일을 모두 압축 해제해야합니다. 이것을 종종 "고체"아카이브라고합니다.

마찬가지로 tar는 파이프 라인에 유용하기 위해 필요한 "스트리밍"형식이므로 tar 아카이브에는 글로벌 인덱스가 없으며 tar 아카이브의 내용을 추출하는 것만 큼 비용이 많이 듭니다.

이와 대조적으로 Zip 및 RAR 및 7-zip (최신 Windows 플랫폼에서 가장 많이 사용되는 아카이브)은 일반적으로 각 파일을 개별적으로 압축하고 메타 데이터를 약간 압축합니다. 따라서 아카이브에서 파일을 저렴하게 나열하고 개별 파일을 추출 할 수 있지만 동일한 아카이브에있는 여러 파일 사이의 중복성을 활용하여 압축률을 높일 수는 없습니다. 일반적으로 이미 압축 된 파일을 압축해도 파일 크기가 더 줄어들지는 않지만 때때로 압축 파일 내에 zip 파일이 표시 될 수 있습니다. 첫 번째 압축은 많은 작은 파일을 하나의 큰 파일 (압축이 비활성화 된 경우)로 바꿨습니다. 그런 다음 압축하여 단일 엔티티로 압축합니다.

다른 플랫폼과 철학 사이에는 교차 수분 gzip이 있습니다. 본질적 zip으로 아카이버 xz7-zip없는 압축기이며 아카이버가없는 압축기입니다.

다른 특수 압축기가 있습니다. PPM 변형 및 후속 제품 ZPAQ은 리소스 소비와 상관없이 최대 압축을 위해 최적화되었습니다. 압축을 풀 때만 큼 많은 CPU와 RAM을 쉽게 씹을 수 있으며 압축 해제는 압축과 마찬가지로 과세됩니다 (반면에 가장 널리 사용되는 압축 도구는 비대칭입니다 . 압축 해제는 압축보다 저렴합니다).

스펙트럼의 다른 말단에서 lzo, snappyLZ4압축 비용으로 최대 속도와 최소의 자원 소비 설계된 "빛"압축기이다. 파일 시스템 및 기타 객체 저장소에서 널리 사용되지만 독립형 도구만큼 사용되지 않습니다.


어느 것을 골라야합니까?

보관 :

Ubuntu를 사용하기 때문에 tar다른 곳에서 쉽게 읽을 수있는 파일을 만들려고하지 않는 한 보관 이외의 다른 것을 사용할 이유가 없습니다 .

zip유비쿼터스는 이길 수 없지만 유닉스 중심이 아니며 파일 시스템 권한 및 소유권 정보를 유지하지 않으며 구운 압축은 구식입니다. 7-zip 및 RAR (및 ZPAQ)은 최신 압축 기능을 제공하지만 Unix 파일 시스템 보관에는 적합하지 않습니다 (압축기로 사용하는 것을 막을 수는 없지만). RAR도 독점적입니다.

압축:

최대 압축을 위해 http://mattmahoney.net/dc/text.html 의 거대한 벤치 마크와 같은 벤치 마크를 볼 수 있습니다 . 이를 통해 관련된 트레이드 오프에 대한 더 나은 아이디어를 얻을 수 있습니다.

그래도 최대 압축을 원하지 않을 것입니다. 너무 비싸요.

xz최신 Unix 시스템에서 가장 널리 사용되는 범용 압축 도구입니다. 나는 7-zip이 밀접하게 관련되어 있기 때문에 xz 파일도 읽을 수 있다고 생각합니다.

마지막으로 : 단기 스토리지 이외의 데이터를 보관하는 경우 나중에 두통을 최소화하기 위해 오픈 소스를 선택해야합니다.


1

lzo, gz, b2, lzma (.lzma2 =.xz)"스트림"컴프레서 : 파일, 디렉토리 및 메타 데이터와 같은 사용 권한과 관련하여 모르는 파일을 압축합니다. tar와 같은 아카이버를 사용하여 모든 데이터를 바이트 스트림 (tar 파일)으로 묶고이를 압축기로 압축해야합니다. 관심있는 단일 파일 의 데이터 인 경우 해당 파일 만 이러한 압축기 중 하나에 공급할 수도 있습니다.

Tar, cpio and pax아카이버 : 많은 파일과 디렉토리를 가져 와서 데이터와 메타 데이터를 단일 파일로 인코딩합니다. tar는 가장 인기 있고 호환이 가능하지만 세 가지의 기술적 장점은 최소한의 시간 동안 종교 전쟁이있을 정도로 충분히 적습니다.

7z와 zip은 컴프레서이자 아키텍처입니다. 그런 다음 모든 데이터와 메타 데이터를 저장하고 압축하십시오. 그러나 AFAICT는 유닉스 권한을 저장하지 않습니다.

Zip은 DEFLATE라는 gzip과 동일한 알고리즘을 사용합니다. 7z는 lzma 알고리즘을 사용합니다

tar.gz 등에서 단일 파일을 읽으려면 tar 파일이 충분히 노출 될 때까지 전체 gz 스트림을 압축 해제하여 압축을 풀어야합니다. Zip을 사용하면 각 파일을 개별적으로 압축 및 추출 할 수 있습니다. 7z는 어느 쪽이든 동작 할 수 있습니다.

압축 비율 및 속도 : gzip 및 lzo는 압축 및 압축 해제 속도가 매우 빠르지 만 압축 비율은 낮습니다. 또한 압축하는 데 많은 메모리가 필요하지 않습니다. gzip은 lzo보다 약간 느리고 압축 비율이 조금 더 좋습니다.

너무 빠르므로 디스크에서 gz 또는 lzo 압축 파일을 읽고 압축되지 않은 파일을 디스크에서 직접 읽는 대신 즉시 압축을 풀 수 있습니다.

LZMA (xz)는 일반 데이터에 대한 뛰어난 압축을 제공하지만 압축에 상당한 양의 메모리를 사용하여 압축 및 압축 해제에 시간이 오래 걸립니다.

bz2는 높은 압축 알고리즘으로 선택되었지만 lzma보다 느리고 압축 및 압축 해제에 더 오래 걸리므로 선호하지 않습니다. 그러나 특정 종류의 데이터 (dna 시퀀스, 같은 바이트의 매우 큰 실행 파일 등)의 경우 bzip2는 다른 모든 것을 이길 수 있습니다. 예를 들어, 나는 1GB의 4GB 파일을 압축해야했고 b2는 내가 10KB로 줄 였지만 lzma는 내가 올바르게 기억하면 약 10MB를 가져갔습니다.


실제로 lzma는 압축 해제 속도가 매우 빠릅니다.
psusi

0

특히 큰 파일의 경우을 사용할 수 있습니다 rzip. 먼저 900MB의 큰 블록 내부의 중복 데이터를보고이를 인코딩 한 다음 데이터를 bzip2로 넘깁니다 (실제로는 아니지만 동일한 알고리즘이 사용됨).

효과? 보다 훨씬 빠르기 때문에 xz, lzma또는 bzip2그와 나의 경험에서의 압축 비율 라이벌 lzma. 그래도 RAM 돼지입니다.

http://en.wikipedia.org/wiki/Rzip

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