0

次第に大きなサイズの入力ファイルを入力して、プログラムのストレス テストを行う必要があります。時間とそれらのコピーを同じファイルinputSmall.txtに複製したい入力ファイルがあります。大きなファイルです。次の単純なループよりも高速に動作するものがあれば (例):NcatNN=1000

for i in {1..1000}
do 
    cat inputSmall.txt >> input1000.txt
done

inputN.txt私のマシンには、非常に大きなsを格納するのに十分なディスク容量がNあり、関連する場合に備えて大量の RAM があります。

どうも

4

3 に答える 3

0

この方法では、より高速かつ「指数関数的」に実行できますが、tmp ファイル用に追加のディスク領域が必要になります。

input=$1

new=${input}.new.txt
tmp=${input}.tmp.txt

cat ${input} > ${new}
cat "" > ${tmp}

# 2^10=1024
for ((i=0; i<10 ; i++))
do
        cat ${new} >> ${tmp}
        cat ${tmp} >> ${new}
done

rm ${tmp}
于 2015-10-12T20:49:19.073 に答える
0

catシェルの一部ではなく、外部コマンドです。すべての外部コマンドと同様に、起動にはかなりのオーバーヘッドがあります。同様に、実行>>input1000.txtはかなりコストのかかるファイルシステム操作です。ディレクトリに関連付けられた inode を検索して開き、(スコープを離れると) 内容をフラッシュしてファイルを閉じます。

これらのことを一度だけ行う方がはるかに効率的です。


の最後の行が改行で終わると仮定するとinputSmall.txt、以下は正しく機能し、オーバーヘッドがはるかに少なくなります。

in=$(<inputSmall.txt)        # read the input file only once
exec 3>>input1000.txt        # open the output file only once

for ((i=0; i<1000; i++)); do
  printf '%s\n' "$in" >&3    # write the input from memory to the output fd
done
exec 3>&-                    # close the output fd
于 2015-10-12T20:52:31.683 に答える