Bash

以 YYYY-mm-dd HH:MM:SS 格式列出每秒建構測試文件的快速方法

  • March 6, 2011

我想創建一個包含由第二個列出的日期的行的大型測試文件,但是我的方法花費了非常長的時間……(或者至少,感覺是這樣的:)…… 43 分鐘只創建 1051201 行。20.1 MB 文件….

我想創建一個更大的文件,每行的日期都是唯一的。

有沒有比我處理它的方法更快的方法?:

# # 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  ============

我沒有做任何基準測試,但我看到了一些潛在的改進。

您為每次呼叫打開和關閉文件date。這是一種浪費:只需將重定向放在整個循環中。

while …; do …; done >"$file"

您正在date為每條線路單獨呼叫。Unix 擅長快速呼叫外部程序,但內部程序更勝一籌。GNU date 有一個批處理選項:在標準輸入上輸入日期,它會漂亮地列印它們。此外,要列舉一系列整數,請使用seq,它可能比在 shell 中解釋循環更快。

seq -f @%12.0f $secBeg $secEnd | date -f - '+%Y-%m-%d %H:%M:%S' >"$file"
cnt=$(($secY2 + 1))

一般來說,如果您的 shell 腳本太慢,請嘗試在專用實用程序中執行內部循環 - 此處為seqand date,但通常為sedor awk。如果您無法做到這一點,請切換到更高級的腳本語言,例如 Perl 或 Python(但如果您適合它們的案例,專用實用程序通常更快)。

引用自:https://unix.stackexchange.com/questions/8273