대용량 파일을 위해 gzip으로 "cat" 파이핑하는 것보다 리소스 집약적이지 않은 대안

대용량 파일을 위해 gzip으로 "cat" 파이핑하는 것보다 리소스 집약적이지 않은 대안

파일이 몇 개 있는데 그 중 일부는 매우 크므로(예: 수 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. 일부 시스템에는 ioniceI/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]

관련 정보