병렬 코킹

병렬 코킹

해양학자 친구가 직장에서 몇 달 간의 데이터를 백업해야 합니다. 그녀는 너무 힘들어서 자원했습니다. 백업해야 할 디렉터리가 수백 개 있고 디렉터리와 동일한 이름을 가진 파일에 tar/bzip으로 압축하려고 합니다. 이 작업을 순차적으로 쉽게 수행할 수 있지만 - 내 워크스테이션에 있는 수백 개의 코어를 활용하고 싶습니다.

질문: find 및 -n -Pargs 또는 GNU Parallel을 사용하여 최종 제품의 이름을 지정할 때 가능한 한 많은 코어를 사용하기 위해 디렉토리를 tar/bzip으로 압축하려면 어떻게 해야 합니까 origonalDirName.tar.bz2?

저는 find를 사용하여 동시에 100개의 파일을 압축하고 있으며 속도가 매우 빠릅니다. 비록 각 파일 이름을 각 디렉토리의 파일 이름으로 만드는 방법을 모르지만 이것이 문제에 대한 해결책입니다.

답변1

그냥 tar파이프 stdout로 연결하면 됩니다 pigz. (디스크 액세스를 병렬화하는 것이 아니라 압축 부분만 병렬화하고 싶을 가능성이 높습니다.)

$ tar -c myDirectory/ | pigz > myDirectory.tar.gz

위와 같은 간단한 호출은 tar기본적으로 가역적인 방식으로 디렉터리 트리를 조인합니다. 이 예와 같이 압축 부분이 분리될 수 있습니다.

pigz멀티스레드 압축을 수행합니다. 사용하는 스레드 수는 조정될 수 -p있으며 기본값은 사용 가능한 코어 수입니다. 더 자세한 정보는 다음에서 확인할 수 있습니다.Pigz github 저장소

답변2

pbzip2는 잘 작동합니다. 위의 답변과 마찬가지로 tar를 stdout으로, 파이프를 pbzip2로 연결합니다.

$ tar -cf - mydir/ | pbzip2 > mydir.tar.bz2

pbzip2는 프로세서 수, 사용된 메모리 양, 압축 수준 등을 조정할 수 있는 여러 옵션을 허용합니다.

http://compression.ca/pbzip2/

또는 디렉터리당 하나의 아카이브(디렉터리 이름에 공백이나 특수 문자가 없다고 가정):

for dir in * ; do 
     [[ ! -d ${dir} ]] && continue
     tar cf -  ${dir} | bzip2 > ${dir}.tar.bz2 &
done

답변3

GNU Parallel을 사용하면 다음과 같습니다:

parallel tar jcvf /tmp/{= s:/$:: =}.tar.bz2 {} ::: */

또는:

parallel tar jcvf /tmp/{}.tar.bz2 {} ::: *

더 나은 압축을 위해 다음을 시도해 보십시오.

parallel tar -I pxz -cvf /tmp/{= s:/$:: =}.tar.xz {} ::: */

s:/$::Perl 표현식입니다. 결말을 없앴다/

관련 정보