量已不可改变
时间如何缩短
我以身陷这该死的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.