入力ファイル(各ファイルに多数の入力行が含まれる)でいっぱいのディレクトリが指定されているシェルスクリプトの問題があり、それらを個別に処理し、各出力を一意のファイル(別名、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の答えを読んだ後、自分の並列実装のために足りない部分をまとめることができました。彼の答えは素晴らしいですが、私が追加した研究とメモは次のとおりです。
完全なプロセスを実行する代わりに、概念実証コマンドから始めて、自分の環境で彼のソリューションを証明しようと考えました。私の2つの異なる実装(およびメモ)を参照してください。
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/*
この2番目のソリューションは、パラレルの入力変数パラダイムを使用してファイルを読み取りますが、初心者にとっては、これははるかに混乱を招きます。私にとっては、find aとpipeを使用することで私のニーズは十分に満たされました。