2016-02-12 77 views
1

我在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一些問題。

有關我如何提高性能的任何建議?

+3

要提高性能,可以:1)用'awk'或其他語言重寫所有內容或者2)不要使用太多無用的子殼和管道!你的行'printf「$ {p}」| awk'{printf $ 1}'是荒謬的,而最後一個'awk'也是荒謬的。你應該使用'read'作爲:'while read -r linetime secondfield thirdfield;做...; done'。該行的第二個和第三個字段位於相應的變量中。另外,'experimentdate = $(eval $ datecmd)'這行看起來很荒謬,而且非常緩慢:它產生了一個沒有任何內容的子shell(並且很可能被破壞)。什麼是'datecmd'? –

+0

'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

+2

不要把這個變量!創建_function_代替! –

回答

1

您不想爲循環中處理的每一行啓動awk。用awk替換你的循環或用內置命令替換awk。
兩個awk都只用於打印。將這些行與附加參數替換爲printf命令。 我不明白datecmd(不使用$linetime,但使用輸出變量experimentdate)的代碼塊,但這個應該優化:您可以使用正則表達式或其他技巧?
所以你沒有調awk,但決定完全使用awk或從while循環中取出它。

2

如果你用awk完成所有處理,你的性能會提高。 Awk可以直接讀取輸入文件,表達條件並運行外部命令。

awk不是唯一的一個。 Perl和Python將非常適合這項任務。