ありそうもない。どちらも一度にファイル全体をメモリに丸呑みすることはないので、基本的に制限は何よりもディスクI/Oレートになります。
私はそれが実際にぶら下がっていない(完全に停止している)ことを収集します、はるかに可能性が高いのは、より大きなファイルを処理するのに少し時間がかかっていることです。
あなたが試すことができるいくつかのこと。
new_file.txt
まず、そのファイルをプロセスに送信する場合はawk
、中間ファイルをまったく作成しないでください。次のことができるはずです。
sed 's/\"//g' old_file.txt | awk 'some commands' >next_file.txt
第二に、これはかなり単純な置換であるため、一般的なケースに対応する必要があるために実行が遅くなる可能性のあるsed
またはスクリプトに依存するよりも、独自の固定フィルターを作成する方が速い場合があります。python
言い換えれば、次のようなものです。
create 1M buffer
read up to 1M from input
while not EOF:
go through data removing `"` characters.
write changed buffer to output.
read up to 1M from input
適切なCコードは次のとおりです。
#include <stdio.h>
#include <errno.h>
static char buff[1000000];
int main (void) {
int sz;
char *src, *dst;
while ((sz = fread (buff, 1, sizeof(buff), stdin)) > 0) {
src = dst = buff;
while (sz-- >= 0) {
if (*src == '"') {
src++;
continue;
}
*dst++ = *src++;
}
sz = dst - buff;
if (fwrite (buff, sz, 1, stdout) != 1) {
fprintf (stderr, "Error %d writing data\n", errno);
return -1;
}
}
return 0;
}
これは、特定のケースの場合であるため、より高速に実行される可能性がありますが、すべての最適化と同様に、推測しないでください。
私のシステムでは、そのコードをコンパイルするとgcc -O3
、最初に次の結果が得られましたsed
。
pax> time ( cat Photo_* | sed 's/"//g' >/dev/null )
real 0m0.094s
user 0m0.080s
sys 0m0.024s
pax> time ( cat Photo_* | sed 's/"//g' >/dev/null )
real 0m0.097s
user 0m0.076s
sys 0m0.032s
pax> time ( cat Photo_* | sed 's/"//g' >/dev/null )
real 0m0.095s
user 0m0.092s
sys 0m0.012s
pax> time ( cat Photo_* | sed 's/"//g' >/dev/null )
real 0m0.096s
user 0m0.060s
sys 0m0.048s
pax> time ( cat Photo_* | sed 's/"//g' >/dev/null )
real 0m0.095s
user 0m0.088s
sys 0m0.016s
次に、カスタマイズされたフィルターの場合:
pax> time ( cat Photo_* | ./qq >/dev/null )
real 0m0.030s
user 0m0.012s
sys 0m0.028s
pax> time ( cat Photo_* | ./qq >/dev/null )
real 0m0.032s
user 0m0.008s
sys 0m0.032s
pax> time ( cat Photo_* | ./qq >/dev/null )
real 0m0.030s
user 0m0.012s
sys 0m0.028s
pax> time ( cat Photo_* | ./qq >/dev/null )
real 0m0.030s
user 0m0.012s
sys 0m0.028s
pax> time ( cat Photo_* | ./qq >/dev/null )
real 0m0.030s
user 0m0.012s
sys 0m0.028s
したがって、平均system+user
とwallclock
時間は次のとおりです。
system+user wallclock
sed 0.1056 0.0954
custom 0.0400 0.0304
したがって、カスタムフィルタを使用すると、一般的な場合よりもパフォーマンスが向上する可能性があります。テストデータの場合、そのワイルドカードに一致するファイルが3つあり、サイズ3427158
は、、5462472
で5921534
あるため、合計で約14Mになります。
より大きな入力サイズの場合、3,791,657,984バイト(約4G)の単一ファイルを使用すると、sed
(ユーザー+システム)時間は27.037秒で、カスタム時間は9.020秒でした(5つのサンプルの取得と平均化の両方)。
また、質問の編集に関して、このプロセスが別のより重要なプロセスの速度を低下させている場合は、そこで実行しないでください。パフォーマンスを損なうことなく、ファイルを完全に別のボックスにシフトするコマンドと、そのファイルでスクリプトを心ゆくまで実行できるコマンドの両方nice
を実行する必要があります。 ionice
copy/ftp/rcp
パフォーマンスを低下させたプロダクションボックスでスクリプトを実行した場合、サイトのメンテナの半分がプレートに頭を要求することになります:-)