say:split!我以身陷shell中

量已不可改变
时间如何缩短
我以身陷这该死的shell中

最近在分析网站的日志
将不同的地址的数据分别入库
假设
一次打开链接的开销为  2
一次入库的开销为        1
IO最大并发为           10
每天有500,000条数据在logs文件中,来自3000个地址

问:如何才能在最快的时间最有效率的处理完这些数据

#从日志中去除所有要处理的地址,排序,去除重复并记录重复次数,按重复次数排序,输出行号写入jobs
cat logs|awk ‘{if($7~/^\/[^\/]+$/){print $7}}’|sort|uniq -c|sort -nr |cat -n 〉jobs
#分离jobs,约均分为等行的3份 输出为 jobs.aa jobs.ab jobs.ac
split -l $[$(wc -l jobs |awk '{print $1}')/3+1] jobs jobs.
rm jobs #clear
#开通读取管道3
exec 3〈log/feed/$logs.jobs.aa;
#使用8个worker3进行并行处理
wc=8;#worker数
w=0
while [ $w -lt $wc ]
do
  worker3 $w & #在后台启动worker3
  echo worker 3.$w is run;
  w=$[$w+1];
done

使用管道3进行任务处理
function worker3(){
  n=3.$1;#worker编号
  echo “#begin $n $(date -u)” 〉log/feed/worker.$logs.$n.txt;
  echo “#begin”〉log/feed/log.$logs.$n.txt
  echo “#begin”〉log/feed/err.$logs.$n.txt
  read 〈&3 x;#从管道3读取一行
  while([ "$x" != "" ]) #如果有数据被读出
  do
   i=$(echo $x|awk ‘{print $’1′}’);#job number
   c=$(echo $x|awk ‘{print $’2′}’);#work line count
   b=$(echo $x|awk ‘{print $’3′}’);#work url
   echo “$n $i $c $b $(date -u)” 〉〉log/worker.$n.txt
   cat $logs_file | awk ‘{if($7~/^’$b’$/){print}}’|php parse_useragent_to_db.php 〉〉log/log.$n.txt 2〉〉log/err.$n.txt ; 
   read 〈&3 x;#读取下一行
  done
  echo “#end ” $(date -u) 〉〉log/feed/worker.$logs.$n.txt
  if [ -f jobs.aa ]
  then
   rm jobs.aa;
   echo “#clear ” log/feed/$logs.jobs $(date -u) 〉〉log/feed/worker.$logs.$n.txt
  fi
  return 1;
}

同理构建worker4 4并发,worker5 2并发。

但是现在只能大概的分布一下,谁有更好的方式呢?

看完了要说点啥么?

You must be logged in to post a comment.