xargs 및 cat을 사용하여 스크립트를 병렬로 실행

xargs 및 cat을 사용하여 스크립트를 병렬로 실행

데이터베이스에 많은 수의 CSV 파일을 삽입하고 있습니다. 예를 들어 4개의 프로세스를 실행하는 등 병렬로 수행하고 싶습니다. 이제 다음과 같은 스크립트를 사용하여 수행합니다.

find . -name "*.csv" | xargs -n 1 -P 4 ./run.sh 

run.sh파일을 데이터베이스로 보냅니다 .

cat "$1" | db-client "INSERT INTO ..."

작동하는 것처럼 보이지만 내 질문은: 4개 프로세스의 입력을 혼합하지 않을까요? 실제로 병렬로 실행됩니까, 아니면 다른 프로세스가 완료될 때까지 기다리나요 cat?

답변1

  1. with 및 with 를 사용하지 않는 한 파이프를 사용하지 마십시오 find. 그렇지 않으면 공백이나 개행 문자가 있는 파일 이름이 됩니다.xargs-print0find-0xargs
  2. 유스 케이스가 아니라 cat "$1" | …단지 유스 케이스일 뿐입니다 … < $1. 원하는 대로 더 간결하게 작성할 수 있습니다.
  3. 아니요, 하나의 프로세스가 아니라 완전히 격리된 매개변수 목록과 출력이 있는 4개의 프로세스가 cat있기 때문에 아무것도 "난독화"되지 않습니다 .cat
  4. 예, 병렬로 실행됩니다.
  5. db-client물론 병렬로 여러 번 실행할 수도 있지만 데이터베이스 시스템의 요점은 일관성을 유지하는 것이므로 INSERT명령문을 원자가 아닌 다중으로 설계하는 실수를 저지르지 않는 한 안전합니다.
  6. 병렬성은 여기서 전혀 도움이 되지 않습니다. CSV 파일 액세스와 데이터베이스 쓰기 액세스는 CPU에 국한되지 않고 오히려 기본 직렬화된 IO 제한에 의해 제한되므로 실제로 문제를 해결할 수는 없습니다. 삽입은 쓰기 작업이고 다른 동시 쓰기와 동기화되어야 하기 때문에 병렬화로 인해 상황이 더 복잡해질 수 있습니다.느리게, 데이터베이스가 샤딩된 쓰기를 허용하고 데이터베이스 서버의 대역폭이 스토리지의 읽기 대역폭보다 넓다는 사실을 실제로 알지 않는 한 더 빠르지는 않습니다. 글쎄요, 질문에 그럴 가능성은 없습니다.

관련 정보