0

大きなファイルに増分変更を加えているループがあります。毎回ディスクに書き込むのではなく、名前付きパイプを使用することにしました。ただし、これは、出力を同じ名前付きパイプにリダイレクトできないように見えるため、ループの反復ごとに一意の名前が必要になることを意味します。

$ mkfifo fifotemp
$ echo qwerty > fifotemp &
$ grep qwe <fifotemp >fifotemp &
$ cat <fifotemp
[hangs]

反復ごとに新しい名前付きパイプを作成することもできましたが、これは洗練されていないように思えました。より良い方法はありますか?

4

1 に答える 1

1

単純なパイプと再帰関数を使用できる可能性があります。いつ終了するか、および各再帰レベルで必要な処理を決定するには、すべてを再帰関数に渡す必要があります。この例では、各レベルの各行の先頭に再帰レベルを追加し、レベル 4 で終了します。

#!/bin/bash

doEdits() {
   while read -r line
   do
      echo "$1 $line"
   done
}

doRecursion() {
   level=$(($1 + 1))
   #echo "doRecursion $level" 1>&2
   if [ $level -lt 4 ]
   then
      doEdits $level | doRecursion $level
   else
      # Just output all the input
      cat
   fi
}

doRecursion 0 < myInputFile > myOutputFile

再帰レベルの数はかなり制限されていると思います。そうしないと、開いているプロセスとパイプの数に関するシステム制限に遭遇する可能性があります。

ここでの利点の 1 つは、各パイプに必要なバッファーが小さいことです。マシンに複数のプロセッサがある場合、これも高速になる可能性があります。

于 2013-09-30T14:46:29.260 に答える