Bash
以 YYYY-mm-dd HH:MM:SS 格式列出每秒建構測試文件的快速方法
我想創建一個包含由第二個列出的日期的行的大型測試文件,但是我的方法花費了非常長的時間……(或者至少,感覺是這樣的:)…… 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 腳本太慢,請嘗試在專用實用程序中執行內部循環 - 此處為
seq
anddate
,但通常為sed
orawk
。如果您無法做到這一點,請切換到更高級的腳本語言,例如 Perl 或 Python(但如果您適合它們的案例,專用實用程序通常更快)。