
Linux 시스템에 복사해야 하는 파일 목록이 있습니다. 각 파일의 크기는 10~100GB입니다.
로컬 파일 시스템에만 복사하고 싶습니다. 각각 파일 복사를 담당하는 여러 프로세스를 사용하여 이 작업을 병렬로 수행할 수 있는 방법이 있습니까?단순한방법?
이 작업을 수행하기 위해 멀티스레드 프로그램을 쉽게 작성할 수 있지만 이 작업을 수행하는 저수준 Linux 방법이 있는지 알아보고 싶습니다.
답변1
시스템이 이로 인해 중단되지 않으면(예: 파일이 캐시에 있을 수 있음) GNU Parallelhttp://www.gnu.org/software/parallel/당신에게 도움이 될 수 있습니다:
find . -type f -print0 | parallel -0 -j10 cp {} destdir
이는 10개의 동시 실행을 실행합니다 cp
.
장점: 읽기가 간단합니다.
단점: GNU Parallel은 대부분의 시스템에서 표준이 아니므로 설치해야 할 수도 있습니다.
디렉토리 구조를 유지하려면 다음을 수행하십시오.
find . -type f -print0 |
parallel -0 -j10 mkdir -p destdir/{//}';' cp {} destdir/{//}
자세한 내용은 소개 비디오를 시청하세요.http://www.youtube.com/watch?v=OpaiGYxkSuQ
또한보십시오https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/병렬 디스크 I/O에 대한 설명입니다.
답변2
매우 간단한 이유로 이에 대한 저수준 메커니즘은 없습니다. 이렇게 하면 시스템 성능이 저하됩니다. 플래터 드라이브를 사용하면 각 쓰기가 헤드 배치를 위해 경쟁하게 되어 엄청난 I/O 대기가 발생합니다. SSD를 사용하면 결국 하나 이상의 시스템 버스가 포화되어 다른 문제가 발생하게 됩니다.
답변3
언급했듯이 이것은 끔찍한 생각입니다. 하지만 난 모든 사람이 자신만의 끔찍한 계획을 실행할 수 있어야 한다고 생각해요. 정말...
for FILE in *;do cp $FILE <destination> &;done
별표는 파일의 정규 표현식으로 대체할 수 있습니다. 또는 $(cat <listfile>)
모든 파일을 텍스트 문서에 저장한 경우에는 별표를 대체할 수 있습니다. 앰퍼샌드는 백그라운드에서 명령을 시작하므로 루프가 계속되어 더 많은 복사본이 생성됩니다.
언급한 대로 이렇게 하면 IO가 완전히 소멸됩니다. 그래서...저는 그렇게 하는 것을 별로 추천하고 싶지 않습니다.
--크리스토퍼 카렐
답변4
다음은 파일을 청크하고 모든 청크를 병렬로 복사하는 분산/병렬 및 분산 파일 복사 도구입니다. 다중 스트림을 지원하는 SSD가 있거나 다중 디스크 헤드가 있는 일종의 설정이 있는 경우에만 도움이 될 것입니다.