2014-02-15 3 views
3

디렉토리에 여러 개의 PNG 이미지가 있고 이미지 크기를 최적화하고 줄이기 위해 optipng을 사용하고 있습니다. 문제는 모든 파일을 최적화하는 데 너무 오래 걸리는 것입니다.여러 CPU 코어를 사용하여 디렉토리의 이미지 최적화

나는 쿼드 코어 프로세서를 가지고 있는데, optipng은 디렉토리를 최적화 할 때 이라는 단일 코어만을 사용하고있는 것으로 나타났습니다.

나는 코드를 사용하고 있습니다 :

ls -1 | while read line 
do 
    optipng -o7 "$line" 
done 

이 디렉토리를 읽는 동안 병렬로 네 개의 서로 다른 파일을 optipng을 수행 할 수 있습니까?

답변

4

네 개의 코어를 사용하려면 각각 optipng을 넣고 카운터 번호 n을 사용하여 번호를 추적해야합니다. 나는이 경우 n=4을 사용하고, 그래서 4 개 백그라운드 작업은 주어진 시간에 실행있을거야 :

n=0 
for image in * 
do 
    optipng -o7 "$image" & 
    n=$(($n + 1)) 
    [ "$n" -eq 4 ] && n=0 && wait 
done 

은 (낮은 n 유지) 동시에 많은 BG 작업을 실행하지 마십시오 또는 성능있을거야 패널티. 필요에 따라 코드를 수정하십시오 (특히 * 패턴은 for image in *).

8

xargs과 관련된 다른 해결책이 있습니다. -P 4 4 개 병렬 프로세스를 실행하고 -n 1

find some/dir/ -iname '*.png' -print0 | xargs -0 -n 1 -P 4 optipng -o7 

프로세스 당 최대 하나의 파일 이름을 사용한다. 또한

, 당신은 줄 바꿈으로 구분 된 파일 이름이있는 경우, 사용 : Joe Lencioni comment on a blog

find some/dir/ -iname '*.png' | sort | xargs -d \\n -n 1 -P 4 optipng -o7 

감사합니다.


업데이트 : 내가 병렬로 여러 이미지 (optipng보다 높은 압축주는) zopflipng를 호출하는 쉘 스크립트를 작성했습니다 : zopflipng_in_place

+0

호기심에서 벗어나서 왜 프로세스 당 하나의 파일 이름으로 제한하고 싶습니까? – UpTheCreek

+1

@UpTheCreek :'optipng'는 여러 개의 파일 이름을 지원하므로 사용할 수 있습니다. 그러나 프로세스 당 하나의 파일을 할당하면 더 나은 배포가 이루어져야합니다. 2 개의 병렬 프로세스 (각각 하나의 CPU 코어에 있음)를 고려하고, 2 개의 매우 느린 (매우 큰) 및 2 개의 매우 빠른 4 개의 파일을 고려하십시오. 프로세스 당 2 개의 파일을 할당하면 매우 느린 2 개의 파일이 동일한 CPU 코어에 대기하고 다른 코어는 유휴 상태가됩니다. 프로세스 당 1을 지정하면 파일이 남아 있지 않을 때까지 CPU 코어를 유휴 상태로 두어서는 안됩니다. –

+1

그냥 몇 가지 실험을 시도하고 높은 n 값 (내 경우에는 50)을 전달하는 성능이 훨씬 향상되었습니다. '-n 50 -P 3'에서는 3 코어에 100 % cpu를 사용하게되었습니다. '-n 1 -P 3'을 사용하면 CPU 사용량이 너무 많이 증가했습니다 (아마 더 많은 프로세스를 설정/해제하는 오버 헤드가 높아짐에 따라). – UpTheCreek

1

내가 병렬 GNU와 optipng 사용을 (에 포함 모든 리눅스 배포본) :

parallel --bar 'optipng {}' ::: file1.png file2.png morefile*.png 

이점 : 진행률을 나타내는 막대가 있습니다.

+0

@MarcusJ 이름'file1.png file2.png morefile * .png'는 예제 파일 이름입니다. 파일 이름으로 바꾸십시오. 그 당시 많은 파일을 가지고 있다면 (나는 그것이 4000 개 이상이라고 생각한다), 몇 단계로해야한다. 파일의 일부를 다른 하위 디렉토리로 이동하십시오. – erik

관련 문제