xargs로 간편한 병렬 처리
안녕하세요, 무능입니다.
오랜만에 글을 올려 죄송하지만 살아있습니다.
Ryzen 5를 중고로 샀는데 예상치 못하게 핀이 부러져서 메모리 한 장만 인식하는 등의 사건도 있었지만 어떻게든 살아가고 있습니다.
AM4 마더보드를 저렴하게 M-ATX 하나 더 구했으니, 그 Ryzen 칩은 미니 PC로 조립하는 데 사용할까 생각 중입니다.
편리한 xargs
xargs - Wikipedia
UNIX 명령어로 존재하는 xargs는 매우 편리합니다.
처음에는 익숙하지 않았지만 사용하면 할수록 유용성이 발견되는 아주 좋은 명령어이며, 원라이너로 간단한 루프 문을 작성하는 수고조차 필요 없습니다.
Use Case
예를 들어, yt-dlp로 동영상을 저장하고 싶은 것이 줄마다 존재한다고 가정해 봅시다.
url1
url2
url3
아무래도 일괄 병렬 처리로 넘겨버리면 CPU 부하가 심해지므로, 이것을 2 프로세스씩 실행하고 싶다면 다음과 같이 작성할 수 있습니다.
cat url-txt | xargs -I {} -P 2 yt-dlp {}
놀랍게도 이것만으로 2 프로세스씩 처리할 수 있습니다.
분해해 봅시다
자, 이것은 어떻게 작동할까요?
위는 다음과 동의어입니다
yt-dlp url1 ; yt-dlp url2
yt-dlp url3
메커니즘적으로는 실행할 때마다 xargs에 전달된 명령어를 그때그때 실행하는 것이 됩니다.
read line하여 배열로 저장하는 것과 같은 이미지일까요?
옵션이 없는 경우는?
옵션이 없다면, 일괄적으로 xargs에 전달된 명령어에 인자를 넘겨줍니다.
대응하는 명령어가 제한적이므로, -I 옵션을 사용하는 것이 좋을 것 같습니다.
다음과 같은 경우
cat url-txt | xargs yt-dlp
이 경우, 다음 명령어를 실행한 것이 됩니다.
yt-dlp url1 url2 url3
따라서, 가능한 한 -I로 처리하는 것이 좋을 것 같지만, 경우에 따라 옵션 없이도 괜찮을 것 같습니다.
Use Case2
find 명령어로 특정 파일명만 grep하거나 sed하고 싶을 때도 편리합니다.
find . -name "testfile" | xargs -I {} grep "return 0" {}
이런 식으로, 특정 파일만 grep하는 것이 이렇게 짧은 코드로 가능합니다.
그럼 오늘은 여기까지.
다음에 또 잘 부탁드립니다.