파일의 수와 크기가 크기 때문에 해시 계산 프로세스를 병렬화하고 싶습니다. 이 명령은 하나의 스레드만 사용하기 때문에 CPU 사용량을 보면 좌절감을 느낍니다. 어떻게 병렬화할 수 있습니까?
sha256sum foo.mp4
OR
openssl -dgst sha256 foo.mp4
답변1
파일 전체를 병렬화하려면 GNU Parallel을 사용할 수 있습니다.
parallel sha256sum ::: *
단일 파일의 병렬 해싱은 Merkle 트리를 사용하는 특정 해시 함수를 사용하여 수행할 수 있습니다. b3sum
그런 도구입니다.
답변2
답변3
xargs
-P
여러 작업을 병렬로 실행하도록 선택할 수 있습니다 . Ole Tange의 프로그램보다 유연성이 훨씬 떨어지지 parallel
만 대부분의 간단한 병렬화 작업에는 충분합니다.
예를 들어:
find . -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
-P 0
xargs에게 가능한 한 많은 작업을 병렬로 실행하도록 지시합니다. 예를 들어 32스레드 Threadripper 1950x에서는 32개의openssl
작업을 병렬로 실행합니다.-n 1
하나의 인수만 사용하여 각 작업을 실행하도록 xargs에 지시합니다. 명령줄에서 처리할 수 있는 여러 파일 이름에 대해 하나의 작업이 최적은 아니지만openssl dgst
거의 항상-n
(또는-L
) 옵션을xargs -P
.그렇지 않으면 각 명령줄에 가능한 한 많은 인수를 입력하려고 시도합니다. 일반적으로 수만 개의 인수가 없으면 하나의 작업만 생성됩니다. Linux에서 명령줄 길이 제한은 일반적으로 200만 자(2097152자)입니다( 확인
getconf ARG_MAX
). 이렇게 하면 많은 파일 이름이 허용됩니다.가장 좋은 방법은 가지고 있는 매개변수 수를 세어 이를 병렬로 실행하려는 작업 수로 나누는 것입니다. 예를 들어
t=32 numfiles=$(find .//. -name '*.mp4' | grep -c //) let n=numfiles/t find . -name '*.mp4' -print0 | xargs -0r -n "$n" -P "$t" openssl dgst -sha256
참고: -P
xargs에 대한 표준 POSIX 옵션이 아닙니다. GNU 또는 *BSD xargs가 필요합니다. 어쩌면 다른 버전이 있을 수도 있습니다.