YYYY-mm-dd HH:MM:SS形式で1秒あたりにリストされるテストファイルを作成する簡単な方法

YYYY-mm-dd HH:MM:SS形式で1秒あたりにリストされるテストファイルを作成する簡単な方法

秒単位でリストされている日付行を持つ大きなテストファイルを作成したいのですが、私のアプローチは非常に長い時間がかかります...(または少なくともその感じです:)... 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などのより高いレベルのスクリプト言語に切り替えます(ただし、ユースケースに適している場合は、専用のユーティリティがより速くなることがよくあります)。

おすすめ記事