2016-02-12 69 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将非常适合这项任务。