0

次のような for ループがあります。

for inf from $filelist; do
  for ((i=0; i<imax; ++i)); do
    temp=`<command_1> $inf | <command_2>`
    eval set -A array -- $temp
    ...
  done 
  ...
done

問題は、command_1少し時間がかかり、出力が少し大きいことです (入力ファイルの大きさにもよりますが、900MB が最大です)。そこで、スクリプトを次のように変更しました。

outf="./temp"
for inf from $filelist; do
  <command_1> $inf -o $outf
  for ((i=0; i<imax; ++i)); do
    temp=`cat $outf | <command_2>`
    eval set -A array -- $temp
    ...
  done 
  ...
done

ディスク I/O がパフォーマンスのボトルネックでもあるためか、パフォーマンスは少し改善されましたが、思ったほどではありませんでした。

stdoutの出力をcommand_1保存して、物理ディスク ファイルに保存せずに再利用できる方法があるかどうか知りたいですか?

4

1 に答える 1

1

ネストされたループ内でパイプラインを使用しないでください

新しいコメントと元の質問の別の見方に基づいて、ネストされたループで大量のデータを処理するパイプラインを使用しないことを強くお勧めします。シェル パイプラインは効率的とは言えず、多くのプロセス オーバーヘッドが発生します。

command_1元の問題を見てください。これには、との寄与を調べてcommand_2、別の方法でこれを解決できるかどうかを確認してください。

つまり、元の答えは次のとおりです。

シェルでは、データを格納する方法が 2 つあります。シェル変数またはファイルです。 そのファイルを、Linux の /dev/shm や Solaris の tmpfs などのメモリ ベースのファイル システムに格納しようとする場合があります。

command_1またcommand_2、最適化のために分析することもできます。の出力にcommand_1不要なものはありcommand_2ますか? 2 つの間にフィルタを配置してみてください。

例:

command_1 | awk '{ print $2 }' | command_2

command_2( の出力の列 2 のみが必要であると仮定しcommand_1ます。)

于 2013-04-26T21:21:02.893 に答える