2010-12-03 1 views
34

gzip으로 압축 할 수있는 일련의 파일이 각각 하나씩 있습니다. 서버의 코어 수는 서로 다릅니다. 각 코어에 대해 gzip을 시작하고 gzip이 동일한 파일을 압축하지 않도록 bash 스크립트를 작성하려면 어떻게해야합니까?모든 코어가있는 Gzip

+0

하드 디스크 속도가 제한되지 않습니까? – ruslik

+1

@rulik, 정확하게, HDD 속도는 병목 현상이거나 gzip은 오래 전에 멀티 프로세서 지원을 추가했을 것입니다. –

+9

나는 동의하지 않는다. 내 경험에 의하면 일련의 파일에서 gzip을 실행하면 CPU가 100 %로 고정되고 디스크 I/O는 낮게 유지됩니다. 그렇습니다. 매우 극단적 인 경우에 디스크 I/O가 다음 병목 현상이 될 수도 있습니다. 그러나 이것은 단일 스레드를 실행하는 대신 여분의 코어를 사용하는 훌륭한 이유입니다. – Demosthenex

답변

51

Linux를 사용하는 경우 GNU의 xargs를 사용하여 코어가있는 프로세스를 실행할 수 있습니다.

CORES=$(grep -c '^processor' /proc/cpuinfo) 
find /source -type f -print0 | xargs -0 -n 1 -P $CORES gzip -9 
  • -print0/xargs를 찾을 -0 1 -P 파일 당 하나 개의 GZIP 과정
  • xargs를 의미 작업
  • GZIP의 수를 지정
  • xargs를 -n 파일 이름에 공백으로부터 보호 -9는 최대 압축을 의미합니다.
+8

변수를 내보낼 필요가 없습니다. 백틱 대신'$()'를 사용해야합니다. 'cat'을 사용할 필요는 없습니다.'grep'은 파일을 인자로 받아들입니다. GNU'grep' (다른 사람이 아니라면)은 셀 수 있으므로'wc'가 필요 없습니다. 최종 결과 :'CORES = $ (grep -c^processor/proc/cpuinfo)' –

+1

당신은 절대적으로 옳다. 나는 proc에서 그것을 찾고있는 게으름 뱅이 였고, 함께 자갈을 남겼다. 그게 훨씬 깔끔해. – Demosthenex

+0

다른 프로그램을 위해 2 개의 프로세서를 예약하고 싶다면 다음을 사용할 수 있습니다 (이렇게하려면 더 깔끔하고 더 많은 bash-ish 방법이 있습니다) : CORES = $ (grep -c '^ processor'/ proc/cpuinfo | perl -ane 'print $ F [0] - 2') – Morlock

6

GNU parallel을 확인해보십시오. 나는 또한 당신이 찾고있는 것을하는 것처럼 보이는이 video on youtube을 발견했다.

+0

Parallel은 xargs와 비슷한 플래그를 사용한다고 말하면서 아이러니하게도 최근에 xargs에 여러 프로세스를 시작, 내 대답을 참조하십시오. – Demosthenex

54

다중 스레드 된 gzip 구현 인 pigz이 있습니다. 하나의 파일을 여러 스레드에서 압축하므로 한 번에 여러 파일을 압축하는 것과 비교하여 디스크에서 더 효율적으로 읽을 수 있어야합니다.

+1

나는 그것이 훌륭한 해결책이라고 생각한다! 압축 할 각 블록이 별도의 스레드에서 실행되는 경우 xargs와 같은 것을 사용하여 파일 당 하나의 프로세스를 시작하는 것이 더 낫습니다! 반면, $ X 서버에 사용자 정의 소프트웨어를 설치할 수 없으면 xargs 동작으로 돌아갈 수 있습니다. 위대한 발견! – Demosthenex

+2

알아두면 좋습니다. 안타깝게도 pigz는 우리 서버에 없습니다. : – User1

+0

참고 : pigz는 압축이 아닌 병렬 압축 만 할 수 있습니다. 잘 이해하면 pigz보다 gz 압축의 한계가 더 많습니다. 감압 pigz는 여전히 읽기, 쓰기 및 확인을 분리하기 위해 4 개의 스레드를 사용합니다. – qwertzguy