私たちのスクリプトの1つは、2つのファイルの内容を別のファイルに書き込むことです。次のコマンドは4分かかります。ファイル1にはヘッダーレコードがあり、ファイル2には4GBのデータがあります。ファイル3では、ヘッダーレコードが一番上になければならず、その後にファイル2の内容が続くはずです。
4分でこれを達成するためのより良い方法はありますか?
cat file1 file2 > file3
ありがとうございます
答え1
数回のローカルテストでは、このsed h file >> destination
コマンドは約66%高速で、単一のファイル引数しか許可されていないため、cat
2番目のコマンドを追加するためにスクリプトを少し書き換える必要がありますsed
が、どちらもまだ高速です。
編集:コマンドで測定された4GBランダムテキストファイルとUnicode文字時間を使用してテストされましたtime
。
答え2
私の古いラップトップのハードドライブはあなたのハードドライブより約2倍速かった。
最適化されたスタンドアロンの猫ではなく、BusyBoxで猫を実行しているようです。
4つのコマンドのタイミングを確認しましたが、すべてほぼ同じ結果(10%以内)を示しました。私はGNU cat、sed、awk、ddを使用しました。各テストの前にキャッシュを消去しました(別のウィンドウからsudoに)
echo 3 > /proc/sys/vm/drop_caches
。
sed は (btw) 複数の入力ファイルを処理します。
$ time cat Timer1 Timer2 > Timer3
real 1m57.536s
user 0m0.072s
sys 0m20.456s
$
$ time sed -e '1n' Timer1 Timer2 > Timer3
real 1m54.450s
user 0m15.924s
sys 0m23.420s
$
$ time awk 1 Timer1 Timer2 > Timer3
real 2m0.080s
user 0m21.752s
sys 0m21.444s
$
$ time { cat Timer1 > Timer3
> dd status=none conv=notrunc oflag=append bs=100M if=Timer2 of=Timer3
> }
$
real 2m9.426s
user 0m0.012s
sys 0m18.260s
$
$ ls -lh Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3.7G Mar 7 11:50 Timer3
$
$ ls -l Timer?
-rw-r--r-- 1 paul paul 17 Mar 7 11:01 Timer1
-rw-r--r-- 1 paul paul 3942530050 Mar 7 11:03 Timer2
-rw-r--r-- 1 paul paul 3942530067 Mar 7 12:06 Timer3
これは、タイミングが主にI / Oパフォーマンスによって決定され、使用されるコマンドがそれほど重要ではないことを示しています。 (シェル読み取りループを使用することはまだ良い考えではありません。)
しかし、catとddは編集ツールよりもユーザー時間をはるかに少なく使用することは注目に値します。