파일이 몇 개 있는데 그 중 일부는 매우 크므로(예: 수 GB) 이를 하나의 큰 파일로 연결한 다음 압축해야 합니다. 이렇게 하면 됩니다.
cat file1 file2 file3 file4 | gzip > compress.gz
이로 인해 시스템에 매우 높은 CPU 및 메모리 부하가 발생할 수 있으며 심지어 cat
기가바이트의 메모리가 생성되면 시스템이 충돌할 수도 있습니다.
tar 아카이브를 사용할 수 없으며 실제로 큰 덩어리를 gzip해야 합니다.
cat
먼저 몇 GB를 사용할 필요가 없지만 여전히 모든 파일이 동일한 .gz에 있도록 동일한 gz 파일을 순차적으로 생성하려면 어떻게 해야 합니까 ?
답변1
cat
상당한 CPU 시간(디스크상의 암호 해독이나 압축 해제 및 cat
디스크에서 읽는 프로세스 계산 제외)이나 메모리를 사용하지 않습니다. 단지 파일의 내용을 읽고 이를 작은 덩어리로 루프의 파이프에 씁니다.
그러나 여기서는 필요하지 않습니다. 다음을 수행할 수 있습니다.
gzip -c file1 file2 file3 file4 > compress.gz
(큰 영향을 끼치는 것은 아닙니다.)
이 명령을 사용하여 프로세스의 우선순위를 낮출 수 있습니다 gzip
(CPU 스케줄링 관련) nice
. 일부 시스템에는 ionice
I/O와 동일한 명령이 있습니다.
nice -n 19 ionice -c idle pigz -c file1 file2 file3 file4 > compress.gz
gzip
병렬 버전은 시스템에 가능한 한 적은 영향을 미치면서 Linux에서 실행됩니다 .
compress.gz
다른 디스크에 있으면 (회전 저장소를 사용하는 경우) 효율성이 향상됩니다.
시스템에 사용 가능한 메모리가 있으면 읽 cat
거나 읽은 데이터를 메모리에 캐시할 수 있습니다. gzip/pigz
데이터가 다시 필요하면 그렇게 할 것입니다. 그 과정에서 더 유용한 캐시된 다른 데이터가 제거될 수 있습니다. 여기서는 이 데이터를 사용할 필요가 없을 수도 있습니다.
GNU를 사용하면 다음을 사용하여 시스템에 데이터를 캐시하지 않도록 조언 dd
할 수 있습니다 .iflag=nocache
for file in file1 file2 file3 file4; do
ionice -c idle dd bs=128k status=none iflag=nocache < "$file"
done | nice pigz > compress.gz
답변2
너무 많은 리소스를 사용하지 않고 프로세스를 확장하려면 다음 값을 변경하여 예약 우선순위를 수정해 보세요 nice
.
nice -n 19 cat file1 file2 file3 file4 | gzip > compress.gz
남자는 좋다
-n, --adjustment=N add integer N to the niceness (default 10)
gzip 속도를 조정할 수도 있습니다. 이는 살펴볼 가치가 있습니다( --best
).
사용할 수 있는 다른 방법이 있지만 파일을 분리합니다.
tar
아카이브 형식을 사용하고 싶다면 zip
매개변수를 사용하여 콘텐츠를 동적으로 압축할 수 있지만 이렇게 하면 처리 속도가 높게 유지될 수 있습니다.
tar zcvf compress.tgz file[1234]
zip
또는 여러 파일을 처리할 수 있는 이를 사용할 수 있습니다 .
zip compress.zip file[1234]