我在BASH中編寫了一個簡單的解析器來拆分csv文件並將其轉儲到(temp)SQL輸入文件。在這方面的表現非常糟糕;當在現代系統上運行時,我幾乎不會每秒破解100行。我意識到最終的答案是以更高性能的語言來重寫這個,但作爲一個學習機會,我很好奇我可以在哪裏提高BASH的技能。 我懷疑是通過寫入內存而不是文件來獲得收益,然後一次沖洗文件到文件,但我不清楚BASH何時/何時會對內存使用感到不滿(最大的文件我已解析已低於500MB)。性能調優AWK?
下面的代碼塊似乎吃了大部分的週期,據我所知,由於檢查時間戳,需要線性處理(數據有時間戳,但沒有時間戳,所以我被迫要求用戶對於開始日,並檢查時間戳是否已經在24:00 - > 0:00循環),所以並行處理似乎不是一種選擇。
while read p; do
linetime=`printf "${p}" | awk '{printf $1}'`
# THE DATA LACKS FULL DATESTAMPS, SO FORCED TO ASK USER FOR START-DAY & CHECK IF THE DATE HAS CYCLED
if [[ "$lastline" > "$linetime" ]]
then
experimentdate=$(eval $datecmd)
fi
lastline=$linetime
printf "$p" | awk -v varout="$projname" -v experiment_day="$experimentdate " -v singlequote="$cleanquote" '{printf "insert into tool (project,project_datetime,reported_time,seconds,intensity) values ("singlequote""varout""singlequote","singlequote""experiment_day $1""singlequote","singlequote""$1""singlequote","$2","$3");\n"}' >> $sql_input_file
忽略singlequote廢話,我需要這兩個OSX &「nix的運行,所以我必須要解決與OSX的AWK和singlequotes一些問題。
有關我如何提高性能的任何建議?
要提高性能,可以:1)用'awk'或其他語言重寫所有內容或者2)不要使用太多無用的子殼和管道!你的行'printf「$ {p}」| awk'{printf $ 1}'是荒謬的,而最後一個'awk'也是荒謬的。你應該使用'read'作爲:'while read -r linetime secondfield thirdfield;做...; done'。該行的第二個和第三個字段位於相應的變量中。另外,'experimentdate = $(eval $ datecmd)'這行看起來很荒謬,而且非常緩慢:它產生了一個沒有任何內容的子shell(並且很可能被破壞)。什麼是'datecmd'? –
'datecmd'是根據OS類型設置的變量。代碼塊它是: \t \t \t '如果[[$ OSTYPE == * 「LINUX」 *] \t \t \t#Linux和OSX/BSD有不同日期的命令。檢查主機運行和選擇的操作系統。 \t \t然後 \t \t日期-d 「$ experimentdate」 +%Y-%間 - %d>的/ dev/null的2>&1 \t \t別的 \t \t日期-j -f「%Y-%間%d「」$ experimentdate「+%Y-%m-%d>/dev/null 2>&1 \t \t fi \t \t is_valid =」$?「 ' 這是由於OSX&「尼克斯包裝不同版本默認的時間的命令。 :( – Keiron
不要把這個變量!創建_function_代替! –