私はmake
自動化されたプロジェクトを使用して大量のデータを生成して処理していますが、レシピは次のとおりです。
processed-data: data
data-processing-program $^ > $@
data:
output-data > $@
それなりdata
のレシピがあるので他のさまざまなターゲットもこれを処理します。。
プログラムoutput-data
はしばらく実行されます。完了したら、data-processing-program
制作を開始して終了しますprocessed-data
。
並行して実行し、data
完了する前にファイルにストリーミングすると、明らかに速度が速くなります。data-processing-program
でそのような関係をどのように表現しますかMakefile
?
私が考慮したオプション:
頑張った複数のレシピを並列に使用
--jobs
/実行-j
ただし、make
従属項目を実行する前にレシピが完了するのを待ちます。これを手動で実行すると、パイプのみが作成されることを確認しました。
output-data | data-processing-program > processed-data
データが提供されるとすぐに処理されます。
data
私はそれを模倣するためにレシピで遊んだ。名前付きパイプファイルの代わりにデータを書き込むためのバックグラウンドプロセスを作成します。ただし、パイプラインのデータは一度だけ読み取ることができるため、複数のレシピを使用して同じデータを処理することはできません。
ベストアンサー1
以下を使用して、tee
出力のあるコピーをディスクに保存し、別のコピーをディスクに供給できますdata-processing-program
。
output-data | tee data | data-processing-program > processed-data
data
これにより、makefile の他のターゲットに対して正しいタイムスタンプを持つコピーが残ります。
このパイプラインを依存関係に関連付ける方法はいくつかありますので、あなたに合った方法を選択してください。 (まだ問題が発生しない限り、フォローアップを実行してください。)たとえば、ルールは両方を生成するので、次のように書くことができdata
ますprocessed-data
。
data processed-data:
output-data | tee data | data-processing-program > processed-data