秒単位でリストされている日付行を持つ大きなテストファイルを作成したいのですが、私のアプローチは非常に長い時間がかかります...(または少なくともその感じです:)... 1051201行だけを作成するのに43分かかります。 20.1MBファイル....
各行の日付が一意であるより大きなファイルを作成したいと思います。
私が処理する方法よりも速い方法がありますか? :
# # BEGIN CREATE TEST DATA ============
# # Create some dummy data.
file=/tmp/$USER/junk
((secY2 =s3600*24*365*2))
cnt=0
secBeg=$(date --date="2010-01-01 00:00:00" +%s)
secEnd=$((secBeg+secY2))
((sec=secBeg))
while ((sec<=secEnd)) ; do
date -d '1970-01-01 UTC '$sec' seconds' '+%Y-%m-%d %H:%M:%S' >>"$file"
((sec+=1))
((cnt+=1))
done
ls -l "$file"
echo Lines written: $cnt
# END CREATE TEST DATA ============
ベストアンサー1
まだベンチマークを実施していませんが、いくつかの潜在的な改善があるようです。
呼び出すたびにファイルを開いて閉じますdate
。これは無駄です。ループ全体にリダイレクトを入れます。
while …; do …; done >"$file"
date
各回線に別々の電話をかけています。 Unixは外部プログラムをすばやく呼び出すのに精通していますが、内部プログラムは依然として優れています。 GNU日付にはバッチオプションがあります。標準入力に日付を入力すると、日付がきれいに印刷されます。また、整数の範囲を列挙するにはを使用してください。seq
これは、シェルでループを解釈するよりも高速です。
seq -f @%12.0f $secBeg $secEnd | date -f - '+%Y-%m-%d %H:%M:%S' >"$file"
cnt=$(($secY2 + 1))
通常、シェルスクリプトが遅すぎる場合は、専用ユーティリティで内部ループを実行してみてください。ここではとですseq
が、date
一般的にsed
またはですawk
。そうでない場合は、PerlやPythonなどのより高いレベルのスクリプト言語に切り替えます(ただし、ユースケースに適している場合は、専用のユーティリティがより速くなることがよくあります)。