입력 파일 (각 입력 줄이 많은 파일)로 가득 찬 디렉토리가 제공되는 쉘 스크립팅 문제가 있으며 각 출력을 고유 파일 (일명 file_1.input 필요)로 리디렉션하여 개별적으로 처리해야합니다. file_1.output에서 캡처되는 등).
사전 병렬 처리에서는 디렉토리의 각 파일을 반복하고 명령을 수행하면서 프로세서를 압도하지 않는 일종의 타이머 / 계산 기술을 수행합니다 (각 프로세스에 일정한 런타임이 있다고 가정). 그러나 항상 그런 것은 아니라는 것을 알고 있으므로 솔루션과 같은 "병렬"을 사용하면 사용자 지정 코드를 작성하지 않고 쉘 스크립트 멀티 스레딩을 얻는 가장 좋은 방법 인 것 같습니다.
이러한 각 파일을 처리하기 위해 병렬로 채울 수있는 방법을 생각했지만 코어를 효율적으로 관리 할 수 있지만 모두 해킹 된 것처럼 보입니다. 나는 매우 쉬운 유스 케이스라고 생각하는 것을 가지고 있으므로 가능한 한 깨끗하게 유지하는 것을 선호합니다 (병렬 예제에서는 아무것도 내 문제가되는 것처럼 보이지 않습니다.
도움을 주시면 감사하겠습니다!
입력 디렉토리 예 :
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
스크립트:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
업데이트 : 아래의 Ole의 답변을 읽은 후 필자의 병렬 구현을 위해 누락 된 부분을 모을 수있었습니다. 그의 대답은 훌륭하지만 여기에 내가 추가 한 연구와 메모가 있습니다.
전체 프로세스를 실행하는 대신 내 환경에서 자신의 솔루션을 입증하기 위해 개념 증명 명령으로 시작하는 것으로 나타났습니다. 내 두 가지 구현 및 참고 사항을 참조하십시오.
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
find (문제가 될 수있는 ls 아님)를 사용하여 입력 파일 디렉토리에서 적용 가능한 모든 파일을 찾은 다음 해당 내용을 별도의 디렉토리 및 파일로 리디렉션합니다. 위의 내 문제는 읽고 리디렉션하는 것이 었습니다 (실제 스크립트는 간단했습니다). 스크립트를 cat로 바꾸는 것이 훌륭한 개념 증명이었습니다.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
이 두 번째 솔루션은 병렬의 입력 변수 패러다임을 사용하여 파일을 읽지 만 초보자에게는 훨씬 더 혼란 스러웠습니다. 나를 위해, 찾기 및 파이프를 사용하면 내 요구가 잘 충족되었습니다.