GNU를 사용하여 sha256 해시 값을 병렬로 계산하는 방법은 무엇입니까?

GNU를 사용하여 sha256 해시 값을 병렬로 계산하는 방법은 무엇입니까?

기준: 여러 다이제스트(md5, sha256)를 동시에 계산하시겠습니까?

SHA256 해시를 계산하려는 파일이 많은 폴더가 있습니다.

나는 세그먼트를 코딩하곤 했습니다:

#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done

현재 sha256 해시를 병렬로 계산하고 있습니다. 단, 내 컴퓨터에는 물리적 코어가 16개만 있습니다.

그렇다면 제 질문은 GNU 병렬을 사용하여 어떻게 실행할 수 있느냐는 것입니다. 단, 시스템에서 사용 가능한 16개의 물리적 코어만 사용하고 해시가 완료되면 자동으로 다음 파일 해시를 선택합니까?

답변1

GNU를 사용하면 parallel쉘 루프를 완전히 피하고 다음을 실행할 수 있습니다.

parallel -P 16 sha256sum {} ">"{}.sha ::: *

이는 sha256sumglob에서 반환된 모든 파일(또는 디렉터리, 그러나 스크립트가 수행하는 작업)에서 실행 되고 *출력을 fileName.sha.

$ ls
file1  file2  file3  file4  file5
$ parallel -P 16 sha256sum {} ">"{}.sha ::: *
$ ls
file1      file2      file3      file4      file5
file1.sha  file2.sha  file3.sha  file4.sha  file5.sha

하지만 @Kusalandanda를 기억해주세요.지적이런 종류의 병목 현상의 주요 원인은 I/O이지 반드시 CPU는 아닙니다. 16개 미만을 병렬로 실행하는 것이 좋습니다.

답변2

다음을 사용합니다(및 를 지원하는 xargs이 유틸리티가 구현 되어 있다고 가정).-0-P

printf '%s\0' * | xargs -0 -L 1 -P 16 sh -c 'sha256sum "$1" > "$1".sha' sh

그러면 현재 디렉토리의 모든 이름이 에 전달됩니다 xargs. 유틸리티는 이러한 각 이름에 대해 xargs인라인 스크립트를 호출하여 최대 16개의 동시 프로세스를 시작합니다. sh인라인 스크립트는 인수를 받아들이고 sha256sum실행하여 결과를 비슷한 이름의 파일로 출력합니다.

.sha이는 동일한 파이프라인의 이전 실행에서 생성된 파일을 선택할 수도 있습니다 . 이를 방지하려면 *다루고 있는 특정 이름보다 더 복잡한 glob을 사용하십시오. 예를 들면 다음과 같습니다 bash.

shopt -s extglob
printf '%s\0' !(*.sha) | xargs ...as above...

또한 sha256sum대용량 파일을 병렬로 실행하는 것은 CPU 바인딩이 아닌 디스크 바인딩일 수 있으며 더 적은 수의 병렬 작업으로도 유사한 작동 속도를 볼 수 있습니다.


GNU에 해당하는 경우 로 parallel바꾸십시오 .xargsparallel


zsh쉘 에서는 할 수 있습니다

autoload -U zargs
setopt EXTENDED_GLOB

zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh

관련 정보