아카이브의 한 가지 문제점 .tar.gz
은 아카이브의 내용을 나열하려고 할 때 컴퓨터가 실제로 압축을 풀기 때문에 파일이 큰 경우 시간이 오래 걸릴 수 있다는 것입니다.
.7z
, .rar
, 등의 다른 파일 형식에는 .zip
이 문제가 없습니다. 내용을 나열하는 데는 몇 분밖에 걸리지 않습니다.
제 생각에는 이것이 .tar.gz
아카이브 형식의 큰 단점입니다.
그래서 실제로 두 가지 질문이 있습니다.
.tar.gz
이러한 단점에도 불구하고 사람들은 왜 여전히 그것을 그렇게 많이 사용합니까?- "인스턴트 콘텐츠 목록" 기능을 원하는 경우 어떤 옵션이 있습니까?(다른 소프트웨어나 도구를 의미합니다)
답변1
여기에는 절충안이 있다는 것을 이해하는 것이 중요합니다.
tar
방법테이프 아카이버. 테이프에서는 주로 순차 읽기 및 쓰기를 수행합니다. 테이프는 오늘날 거의 사용되지 않지만 tar
스트리밍 형식으로 데이터를 읽고 쓰는 기능을 위해 여전히 사용됩니다.
넌 할 수있어:
tar cf - files | gzip | ssh host 'cd dest && gunzip | tar xf -'
zip
그런 일이나 그런 일은 할 수 없습니다 .
zip
먼저 로컬에서 검색 가능한 파일에 저장하지 않고는 아카이브의 내용을 나열할 수도 없습니다. 그림:
curl -s https://github.com/dwp-forge/columns/archive/v.2016-02-27.zip | unzip -l /dev/stdin
불가능한.
콘텐츠를 빠르게 읽으려면 zip
색인 생성이 필요합니다. 인덱스는 파일 시작 부분(이 경우 스트림이 아닌 일반 파일에만 쓸 수 있음)이나 파일 끝 부분에 저장될 수 있습니다. 즉, 아카이버는 인쇄하기 전에 모든 아카이브를 기억해야 함을 의미합니다. 이는 잘린 아카이브를 복구할 수 없음을 의미합니다.
이는 또한 아카이브 구성원을 개별적으로 압축해야 함을 의미하며, 이는 특히 작은 파일이 많은 경우 압축 비율이 훨씬 낮다는 것을 의미합니다.
유사한 형식의 또 다른 단점은 zip
보관이 압축과 관련되어 있으며 압축 알고리즘을 선택할 수 없다는 것입니다. ( ), , 을 차례로 사용한 다음 새로운 tar
고성능 압축 알고리즘을 설계하여 아카이브를 압축하는 방법을 알아보세요 . 암호화도 마찬가지입니다. 오늘날 누가 암호화를 신뢰합니까 ?compress
tar.Z
gzip
bzip2
xz
zip
이제 아카이브의 문제 tar.gz
는 압축을 풀어야 한다는 것이 아닙니다. 압축 해제는 일반적으로 디스크에서 읽는 것보다 빠르지만(대규모 tgz 아카이브의 콘텐츠를 나열하는 것이 메모리에 캐시되지 않은 동일한 압축되지 않은 콘텐츠를 나열하는 것보다 빠르다는 것을 알 수 있음) 전체 아카이브를 읽어야 합니다.
색인을 빠르게 읽을 수 없는 것은 실제로 문제가 되지 않습니다. 보관된 테이블 내용을 자주 읽어야 할 것으로 예상되는 경우 목록을 별도의 파일에 저장할 수 있습니다. 예를 들어 생성 시 다음을 수행할 수 있습니다.
tar cvvf - dir 2> file.tar.xz.list | xz > file.tar.xz
IMO의 더 큰 문제는 아카이브의 순차적 측면으로 인해 아카이브의 시작 부분 전체를 읽지 않고는 단일 파일을 추출할 수 없다는 것입니다. IOW, 아카이브에서는 무작위 읽기를 수행할 수 없습니다.
이제 찾을 수 있는 파일의 경우 반드시 그럴 필요는 없습니다.
tar
압축된 아카이브를 사용하여 gzip
전체적으로 압축하는 경우 압축 알고리즘은 처음에 본 데이터를 사용하여 압축하므로 처음부터 압축 풀기를 시작해야 합니다.
그러나 xz
데이터를 별도의 청크(압축이 효과적일 만큼 큰 크기)로 압축하도록 형식을 구성할 수 있습니다. 즉, 검색 가능한 파일의 경우 압축된 청크의 끝에 인덱스를 유지하는 한 압축되지 않은 무작위 데이터에 액세스할 수 있습니다. (적어도 덩어리).
pixz
(병렬 xz
) 아카이브를 압축할 때 이 기능을 사용하고 tar
, 아카이브의 각 구성원의 시작 인덱스를 파일 끝에 추가할 수도 있습니다 xz
.
따라서 검색 가능한 파일의 경우 압축된 경우 tar 아카이브의 내용 목록을 즉시 얻을 수 있을 뿐만 아니라(메타데이터는 없지만) pixz
:
pixz -l file.tar.xz
그러나 전체 아카이브를 읽지 않고도 개별 요소를 추출할 수도 있습니다.
pixz -x archive/member.txt < file.tar.xz | tar xpf -
7z
이제 Unix에서 이와 같은 것이 거의 사용되지 않는 이유는 zip
주로 Unix 파일을 보관하지 않기 때문입니다. 이는 다른 운영 체제용으로 설계되었습니다. 이를 사용하여 데이터를 충실하게 백업할 수는 없습니다. 소유자(ID 및 이름), 권한과 같은 메타데이터를 저장할 수 없으며 심볼릭 링크, 장치, FIFO 등을 저장할 수 없으며 하드 링크에 대한 정보와 확장 속성 또는 ACL과 같은 기타 메타데이터 정보를 저장할 수 없습니다.
그 중 일부는 임의의 이름으로 멤버를 저장할 수도 없습니다(일부는 백슬래시, 개행, 콜론 또는 ASCII가 아닌 파일 이름을 차단합니다)( tar
그러나 일부 형식에도 제한이 있습니다).
tgz/tar.xz 파일을 디스크에 압축 해제하지 마십시오!
명확하지 않은 경우 tgz
or tar.bz2
, tar.xz
...를 다음과 같이 사용하지 마세요.
unxz 파일.tar.xz tar tvf 파일.tar xz 파일.tar
.tar
파일 시스템에 압축되지 않은 파일이 있으면 뭔가 잘못된 것입니다 .
이러한 xz
스트림 압축기의 요점은 다음과 같은 파이프라인에서 동적으로 사용할 수 있다는 것입니다.bzip2
gzip
unxz < file.tar.xz | tar tvf -
최신 구현에서는 // 자신을 tar
호출하는 방법을 알고 있지만 다음과 같습니다.unxz
gunzip
bzip2
tar tvf file.tar.xz
이 방법도 일반적으로 작동합니다. 즉석에서 데이터의 압축을 다시 풀고 압축되지 않은 버전의 아카이브를 디스크에 저장하지 않습니다.
예
이것은 다양한 형식의 압축된 Linux 커널 소스 트리입니다.
$ ls --block-size=1 -sS1
666210304 linux-4.6.tar
173592576 linux-4.6.zip
97038336 linux-4.6.7z
89468928 linux-4.6.tar.xz
첫째, 위에서 언급한 것처럼 7z와 zip은 소수의 심볼릭 링크를 저장할 수 없고 대부분의 메타데이터가 손실된다는 점에서 약간 다릅니다.
이제 시스템 캐시를 플러시한 후 콘텐츠를 나열할 수 있는 몇 가지 기회가 있습니다.
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time tar tvf linux-4.6.tar > /dev/null
tar tvf linux-4.6.tar > /dev/null 0.56s user 0.47s system 13% cpu 7.428 total
$ time tar tvf linux-4.6.tar.xz > /dev/null
tar tvf linux-4.6.tar.xz > /dev/null 8.10s user 0.52s system 118% cpu 7.297 total
$ time unzip -v linux-4.6.zip > /dev/null
unzip -v linux-4.6.zip > /dev/null 0.16s user 0.08s system 86% cpu 0.282 total
$ time 7z l linux-4.6.7z > /dev/null
7z l linux-4.6.7z > /dev/null 0.51s user 0.15s system 89% cpu 0.739 total
tar.xz
이 7년 된 PC에서도 파일을 나열하는 것이 파일을 읽는 것보다 빠르다는 것을 알 수 있습니다. .tar
디스크에서 추가 메가바이트를 읽는 것이 더 작은 파일을 읽고 압축을 푸는 것보다 빠르기 때문입니다.
그렇다면 7z 또는 zip으로 아카이브를 나열하는 것이 더 빠르겠지만 문제가 되지 않습니다. 아카이브와 함께 파일 목록을 저장하면 쉽게 해결할 수 있다고 말했듯이:
$ tar tvf linux-4.6.tar.xz | xz > linux-4.6.tar.xz.list.xz
$ ls --block-size=1 -sS1 linux-4.6.tar.xz.list.xz
434176 linux-4.6.tar.xz.list.xz
$ time xzcat linux-4.6.tar.xz.list.xz > /dev/null
xzcat linux-4.6.tar.xz.list.xz > /dev/null 0.05s user 0.00s system 99% cpu 0.051 total
캐시를 제거한 후에도 속도는 7z나 zip보다 훨씬 빠릅니다. 또한 아카이브와 해당 인덱스의 누적 크기가 여전히 zip 또는 7z 아카이브보다 작다는 것을 알 수 있습니다.
또는 pixz
색인 형식을 사용하십시오.
$ xzcat linux-4.6.tar.xz | pixz -9 > linux-4.6.tar.pixz
$ ls --block-size=1 -sS1 linux-4.6.tar.pixz
89841664 linux-4.6.tar.pixz
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time pixz -l linux-4.6.tar.pixz > /dev/null
pixz -l linux-4.6.tar.pixz > /dev/null 0.04s user 0.01s system 57% cpu 0.087 total
이제 아카이브의 개별 요소를 추출하기 위해 tar 아카이브의 최악의 시나리오는 마지막 요소에 액세스하는 경우입니다.
$ xzcat linux-4.6.tar.xz.list.xz|tail -1
-rw-rw-r-- root/root 5976 2016-05-15 23:43 linux-4.6/virt/lib/irqbypass.c
$ time tar xOf linux-4.6.tar.xz linux-4.6/virt/lib/irqbypass.c | wc
257 638 5976
tar xOf linux-4.6.tar.xz linux-4.6/virt/lib/irqbypass.c 7.27s user 1.13s system 115% cpu 7.279 total
wc 0.00s user 0.00s system 0% cpu 7.279 total
이는 전체 아카이브를 읽고 압축을 풀어야 하기 때문에 매우 나쁩니다. 비교:
$ time unzip -p linux-4.6.zip linux-4.6/virt/lib/irqbypass.c | wc
257 638 5976
unzip -p linux-4.6.zip linux-4.6/virt/lib/irqbypass.c 0.02s user 0.01s system 19% cpu 0.119 total
wc 0.00s user 0.00s system 1% cpu 0.119 total
내 버전의 7z에는 임의 액세스 권한이 없는 것 같아서 다음보다 나은 것 같습니다 tar.xz
.
$ time 7z e -so linux-4.6.7z linux-4.6/virt/lib/irqbypass.c 2> /dev/null | wc
257 638 5976
7z e -so linux-4.6.7z linux-4.6/virt/lib/irqbypass.c 2> /dev/null 7.28s user 0.12s system 89% cpu 8.300 total
wc 0.00s user 0.00s system 0% cpu 8.299 total
pixz
이제 이전에 생성한 항목이 생겼습니다 .
$ time pixz < linux-4.6.tar.pixz -x linux-4.6/virt/lib/irqbypass.c | tar xOf - | wc
257 638 5976
pixz -x linux-4.6/virt/lib/irqbypass.c < linux-4.6.tar.pixz 1.37s user 0.06s system 84% cpu 1.687 total
tar xOf - 0.00s user 0.01s system 0% cpu 1.693 total
wc 0.00s user 0.00s system 0% cpu 1.688 total
더 빠르지만 아카이브에 큰 청크가 거의 포함되어 있지 않기 때문에 여전히 상대적으로 느립니다.
$ pixz -tl linux-4.6.tar.pixz
17648865 / 134217728
15407945 / 134217728
18275381 / 134217728
19674475 / 134217728
18493914 / 129333248
336945 / 2958887
따라서 pixz
최대 19MB에 달하는 대규모 데이터 블록을 읽고 압축을 풀어야 합니다.
아카이브를 더 작은 덩어리로 만들고 약간의 디스크 공간을 희생하여 임의 액세스 속도를 높일 수 있습니다.
$ pixz -f0.25 -9 < linux-4.6.tar > linux-4.6.tar.pixz2
$ ls --block-size=1 -sS1 linux-4.6.tar.pixz2
93745152 linux-4.6.tar.pixz2
$ time pixz < linux-4.6.tar.pixz2 -x linux-4.6/virt/lib/irqbypass.c | tar xOf - | wc
257 638 5976
pixz -x linux-4.6/virt/lib/irqbypass.c < linux-4.6.tar.pixz2 0.17s user 0.02s system 98% cpu 0.189 total
tar xOf - 0.00s user 0.00s system 1% cpu 0.188 total
wc 0.00s user 0.00s system 0% cpu 0.187 total
답변2
- 이러한 단점에도 불구하고 사람들은 왜 여전히 이를 그렇게 많이 사용하는 걸까요?
비즈니스 및 교육 관리자는 일이 효율적으로 실행될 때 감사하는 것보다 일이 중단될 때 더 주목받는 경향이 있습니다. 그러한 환경실험에 대한 두려움을 키우고,새로운 것을 경멸하다.
- "인스턴트 콘텐츠 목록" 기능을 원하는 경우 내 옵션은 무엇입니까(다른 소프트웨어/도구를 의미합니다)?
다르(디isk아르곤chiver)의 수가 많다.아스팔트유사한 기능에 압축된 아카이브에 대한 빠른 무작위 액세스, AKA 카탈로그 작성, AKA 인덱싱, AKA "인스턴트 콘텐츠 목록"과 같은 향상된 기능이 추가되었습니다.