屋根ふきと拡張性能

屋根ふきと拡張性能

次の比較については、専門家のアドバイスが必要です。

ループを使用するコードスニペット:

for file in `cat large_file_list`
do
    gzip -d $file
done

単純な拡張を使用したコードスニペット:

gzip -d `cat large_file_list`

どちらが速いですか?大規模なデータセットで動作する必要があります。

ベストアンサー1

複雑

以下は時々有効です。

gzip -d `cat large_file_list`

3つの問題は(bashほとんどのBourne様シェルでは)次のようなものです。

  1. ファイル名にスペースタブまたは改行文字が含まれている場合は失敗します($IFS変更されていないと仮定)。その理由は殻のためです。噴射

  2. ファイル名にグローバルアクティブ文字が含まれていても失敗することがあります。シェルが適用されるからです。パス名拡張ファイルリストに

  3. ファイル名が-POSIXLY_CORRECT=1最初のファイルにのみ適用される場合)で始まるか、ファイル名が-

  4. 1つのコマンドラインに入ることができないほどファイル名が多すぎると失敗します。

以下のコードは上記のコードと同じ問題があります(4番目のコードを除く)。

for file in `cat large_file_list`
do
    gzip -d $file
done

安定したソリューション

1 行に 1 つのファイル名のみがあり、名前付きファイルがlarge_file_listその-中になく GNU システムを使用している場合は、次のようにします。

xargs -rd'\n' gzip -d -- <large_file_list

-d'\n'xargs各入力行を別々のファイル名として処理するように指示します。

-rxargs入力ファイルが空の場合は、コマンドを実行しないように指示します。

--gzip次の引数は、で始まってもオプションと見なされないことを示します-。個々のファイルは呼び出されるの-ではなく、引き続き考慮されます。--

xargs各コマンドラインに複数のファイル名が割り当てられますが、その数はコマンドライン制限を超えません。これにより、プロセスを開始する必要がある回数が減り、gzip速度が速くなります。また安全です。ファイル名も保護されます。噴射そしてパス名拡張

おすすめ記事