xargsでお手軽並列処理 - https://soulminingrig.com/posts/easy-parallel-processing-with-xargs/
Conversation
Notices
-
admin太郎 (admin@eyes4you.org)'s status on Sunday, 09-Feb-2025 20:50:04 JST admin太郎
-
いいがう (froggie3@akkoma.yokkin.com)'s status on Sunday, 09-Feb-2025 21:47:44 JST いいがう
@admin Use caseのやつ、確かに2プロセスずつの実行にはなってると思うけど、xargsがハンドルするコマンドが可変長引数に対応してるなら、別解があるよ
POSIXで標準化されてる-Lオプションというのがあるんだけど、一度に渡したい引数の数を指定できるのでこれを使ってもいいと思う(デフォルトでは1つだけ)
~ $ seq 3 | xargs -I@ -P2 echo yt-dlp
yt-dlp 1
yt-dlp 2
yt-dlp 3
~ $ seq 3 | xargs -L2 -P2 echo yt-dlp
yt-dlp 1 2
yt-dlp 3
あとUse case 2の例だけど、大抵の場合grepへ一気に渡しちゃったほうがパフォーマンスが出るよ
引数が大量になっても限界を超えないように内部的に分けて実行してくれるらしい
だから
find . -name "testfile" | xargs -I {} grep "return 0" {}
も
find . -name "testfile" | xargs grep "return 0"
の方が早いと思う -
admin太郎 (admin@eyes4you.org)'s status on Sunday, 09-Feb-2025 21:47:44 JST admin太郎
@froggie3 なんと!というかLオプションそういう意味だったのか
可変引数可能なのは割とコマンドによって変化するからここも適宜なところやな
Thanks☆ -
いいがう (froggie3@akkoma.yokkin.com)'s status on Sunday, 09-Feb-2025 22:42:17 JST いいがう
@admin
あと蛇足かもしれんけど、-Lオプションと似てる-n オプションっていうのもあって、こっちは引数の組を渡すときとかに便利やで
~ $ seq 27 | xargs -L3 | xargs -L3 echo yt-dlp
yt-dlp 1 2 3 4 5 6 7 8 9
yt-dlp 10 11 12 13 14 15 16 17 18
yt-dlp 19 20 21 22 23 24 25 26 27
~ $ seq 27 | xargs -L3 | xargs -n3 echo yt-dlp
yt-dlp 1 2 3
yt-dlp 4 5 6
yt-dlp 7 8 9
yt-dlp 10 11 12
yt-dlp 13 14 15
... -
admin太郎 (admin@eyes4you.org)'s status on Sunday, 09-Feb-2025 22:42:17 JST admin太郎
@froggie3 xargsをxargsに渡す高等テクw
nで渡したほうが並列処理のジョブとしての収まりはいいな -
admin太郎 (admin@eyes4you.org)'s status on Sunday, 09-Feb-2025 22:43:11 JST admin太郎
@froggie3 思ったけど、可変引数で並列処理できるコマンドってそんなにあるんだろうか
普段意識したことなかったわ -
いいがう (froggie3@akkoma.yokkin.com)'s status on Sunday, 09-Feb-2025 23:00:52 JST いいがう
@admin 多分標準的なUNIXコマンドにはないんじゃないかなあ
というかプログラム自体で、ビジネスロジックに加えて並列処理をハンドリングしてたら、その時点で既にUNIX哲学に反してる気がするよね -
admin太郎 (admin@eyes4you.org)'s status on Sunday, 09-Feb-2025 23:00:52 JST admin太郎
@froggie3 しょうみ、このxargsの起源まで掘れてないんだよね
https://en.m.wikipedia.org/wiki/List_of_Plan_9_applications
ここにはないように、Plan9から生まれたものでもなさそうだしGNUといえばGNU ParallelなのでGNU版のxargsはどこから移植してきたのかなと
並列性を意識し始めたような気がするのがUNIXという考え方の本には"並列性を意識せよ"とあるように1980年代以降から並列処理の意識の普及が始まったようにも思えるある意味分散オペレーティングシステムからすれば、並列処理についても同じ議論がPlan9あたりでも起きてそうだなとは思ったものの
記事内にUNIXコマンドという記述はしたものの書いたときはちょっと悩んだw -
いいがう (froggie3@akkoma.yokkin.com)'s status on Monday, 10-Feb-2025 20:28:20 JST いいがう
@admin Wikipedia見ると
Programmer's Workbenchっていうプログラマー向けのUNIX(実用的なUNIX?)
に搭載されたツールとしてのxargsが初出っぽい
https://man.freebsd.org/cgi/man.cgi?xargs
https://en.m.wikipedia.org/wiki/PWB/UNIX
-Pオプションは普通にGNU拡張だね
仕様書見ても登場してなかったわ
https://pubs.opengroup.org/onlinepubs/009604599/utilities/xargs.htmlIn conversation permalink Attachments
-
admin太郎 (admin@eyes4you.org)'s status on Monday, 10-Feb-2025 20:28:30 JST admin太郎
@froggie3 👀
さすが!!!!wwwwwwwwwwwwIn conversation permalink -
admin太郎 (admin@eyes4you.org)'s status on Monday, 10-Feb-2025 20:30:07 JST admin太郎
@froggie3 要所でGNU xargsと言われる所以は、Pオプションという強力なものを作ったからなのかな…
実際他のコマンドもどこからどこまでがGNUのコードなのか気になり始めたらかなり時間かかりそうwIn conversation permalink
-