次の比較については、専門家のアドバイスが必要です。
ループを使用するコードスニペット:
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様シェルでは)次のようなものです。
ファイル名にスペースタブまたは改行文字が含まれている場合は失敗します(
$IFS
変更されていないと仮定)。その理由は殻のためです。噴射。ファイル名にグローバルアクティブ文字が含まれていても失敗することがあります。シェルが適用されるからです。パス名拡張ファイルリストに
ファイル名が
-
(POSIXLY_CORRECT=1
最初のファイルにのみ適用される場合)で始まるか、ファイル名が-
。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
各入力行を別々のファイル名として処理するように指示します。
-r
xargs
入力ファイルが空の場合は、コマンドを実行しないように指示します。
--
gzip
次の引数は、で始まってもオプションと見なされないことを示します-
。個々のファイルは呼び出されるの-
ではなく、引き続き考慮されます。-
-
xargs
各コマンドラインに複数のファイル名が割り当てられますが、その数はコマンドライン制限を超えません。これにより、プロセスを開始する必要がある回数が減り、gzip
速度が速くなります。また安全です。ファイル名も保護されます。噴射そしてパス名拡張。