병렬 프로세스의 실행을 기다리고 출력을 함께 연결하는 방법은 무엇입니까?

병렬 프로세스의 실행을 기다리고 출력을 함께 연결하는 방법은 무엇입니까?

Unix에서 작업하는 것이 처음이고 다음을 순서대로 수행하는 스크립트를 만들고 싶습니다.

  • 기본 .tsv 파일을 가져와 X 파일로 분할합니다. 각 파일에는 Y 줄이 포함됩니다.
  • 프로그램을 통해 각 분할 파일을 실행하고 완료되면 새 .tsv 파일을 출력합니다.
  • 모든 분할 파일의 처리가 완료될 때까지 기다린 후 출력 파일을 하나로 연결합니다.

split나는 and 를 사용하여 파일을 분할하는 방법을 알고 sed있으며 분할 파일을 Python 스크립트를 통해 실행하는 것도 어려울 것이라고 상상할 수 없지만 문제는 병렬 프로그램의 모든 실행이 언제 완료되었는지 확인한 다음 스티치하는 것입니다. 그들의 출력을 하나로 만듭니다.

내가 아는 한, split이름이 자동으로 증가하고 이를 대규모로 병렬화할 수 있습니다.이 SO 질문에서 볼 수 있듯이, 그래서 그 부분을 알아낼 수 있습니다. 병렬 Python 스크립트 세트의 실행 상태를 확인하는 방법이 있습니까? 내가 하고 싶은 일을 어떻게 성취할 수 있나요?

답변1

split -l $Y main.tsv main_part_
for part in main_part_*; do
    program $part &
done
wait
echo "all done"

waitbash 내장 기능입니다. 자세한 내용은 매뉴얼 페이지를 참조하세요.

답변2

Giles가 이미 의견에서 지적했듯이.GNU 병렬분할된 세그먼트의 재결합 순서를 분할하고 유지하는 기능이 내장되어 있으므로 이 작업에 이상적입니다. 일반적으로 행별로 분할되지만 이에 대한 특정 레코드 시작 및 끝을 지정하고 모든 분할 작업에 대해 헤더를 반복하도록 명령할 수 있습니다(탭으로 구분된 값 파일인 경우 .tsv이는 열 헤더일 수 있으며 더 쉽습니다.) 당신을 위해 글을 쓰겠습니다.) 나는 이것을 사용했다병렬 실행xz.

핸들러가 표준 입력에서 입력을 가져와 표준 출력에 출력을 쓰는 필터인 경우 이 작업이 가장 쉽습니다. 다음은 Python 프로그램이 호출된다고 가정합니다.xyz

기본 통화는

cat input.tsv | parallel --pipe -k xyz > output.tsv

--pipe옵션을 사용하면 병렬 처리가 입력을 데이터로 해석하여 호출을 위해 프로그램으로 전송되고(다른 모드가 있음) -k출력 순서를 유지하게 됩니다.

매뉴얼 섹션--pipe세부 블록 크기, 기록 시작 및 끝(기본적으로 중복되지만 숨길 수 있음) 및 중복 헤더.

프로그램에 명령줄 옵션이 필요한 경우 xyz출력 리디렉션 전에 명령줄에서 해당 옵션을 지정할 수 있습니다( > ..).


--pipepart최신 버전이 있는 경우(어쨌든 그래야 함) 입력이 파일(예: 탐색)이라고 가정하고 레코드 및 줄 수를 사용하지 않는 보다 효율적인 옵션을 사용할 수 있습니다 .

 parallel -a input.tsv --pipepart -k xyz > output.tsv

관련 정보