如何开发一个高效率的统计脚本?高手进来!

Devidzhang 2006-12-22 03:13:45
是想做一个网站IP回访率统计的脚本
file1是每天网站访问日志,file2是一个ip库,需要统计file1中的ip是否在file2中出现过,file2大概有50万的记录。file1大概有20万条记录。下面是我的脚本

#!/bin/bash

#...
#前面略过一些脚本

#incount是回访的IP数,newcount是新的访问IP数

incount=0
newcount=0

#file1每行记录的第3列是待检索的ip
while read a1 a2 a3 a4
do
if grep "$a3" file2 > /dev/null >&1
then
incount=`expr $incount + 1`
else
newcount=`expr $newcount + 1`
fi
done < $file1

echo "incount=$incount"
echo "newcount=$newcount"

但是这个遍历的脚本效率很慢,是否有更好的方法,比如用awk的操作,请教高手,100分奉上!
...全文
263 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
playmud 2006-12-25
  • 打赏
  • 举报
回复
的确如此啊,数据量可不算小了,当然也不算大。
我觉得应该分时了,不能集中在一个时间去处理。
你可以没10分钟生成一个文件,然后导出去做一下处理。
另外,ip是从一个int类型来的,如果不当作字符串比较,
而是当作int类型去比较,应该能快不少,你可以写一个专门的程序替代这个grep,
这样效率能高不少。而且你的file2应该是排序的,这样可以折半查找。
一条记录是4byts,50万条就是
2,000,000byte,2M?全部读入内存也不慢。
总之单纯用shell,应该没有质的提高。
gangjh 2006-12-25
  • 打赏
  • 举报
回复
使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL
是否可以优化. SQL Server的优化不怎么懂.
可以说说机器配置,负载,以及现在处理需要多少时间么.
上百万的记录,用shell脚本处理有点冒险.
Devidzhang 2006-12-25
  • 打赏
  • 举报
回复
前面说的“数据库更不理想”,是在一个小级别数据量情况下测了一下,shell快些
Devidzhang 2006-12-25
  • 打赏
  • 举报
回复
我是用sql server,目前公司没有用oracle

阿飞,数据入库由于有索引也比较慢,我们的file1,file2越来越大了,现在都是百万级别。脚本也就是简单的:select ip from table1 where ip in (select ip from table2),没有其他配置。

目前,我只是觉得数据库处理和我写的shell都慢。还没有比较过谁优谁劣。我只是觉得自己写的shell脚本不够好,肯定有更好的方法。
gangjh 2006-12-25
  • 打赏
  • 举报
回复
數據庫生來就是為了處理大量數據.如果它更不行. Oracle, Mysql,bdb使用者該哭泣了.
你用的是什麼數據庫測試的?如何配置?,Table是否建立索引? 腳本是否有優化潛力 ?
20萬與50萬筆記錄連接操作在Oracle中操作該是輕量級的.
Devidzhang 2006-12-25
  • 打赏
  • 举报
回复
阿飞,数据库更不理想,所以才用shell处理,但是似乎shell循环仍很慢,期待更好的方法...

感谢playmud,阿飞
gangjh 2006-12-23
  • 打赏
  • 举报
回复
我覺得grep 20萬次,很耗io時間.
需 讀取,搜索文檔 20萬次.

也許用將文檔按行插入數據庫,用數據庫處理性能更好.

playmud 2006-12-23
  • 打赏
  • 举报
回复
楼上说得俺考虑了,只是觉得排序的过程太浪费时间了,或许得不偿失,否则排序去重file1以后在用楼上的方法,速度肯定快。
gangjh 2006-12-23
  • 打赏
  • 举报
回复
可否先將file1,file2排序.
line1,line2分別對應file1,file2中第一行.
line1 >line2 : 不存在:line2 讀file2下一行.
line1 <line2 : 不存在.line1 讀file1下一行
line1 = line2 : 存在, line1讀file1下一行
這樣效率比較高,設計復雜了點.
仰望星空WU 2006-12-22
  • 打赏
  • 举报
回复
呵,学习
playmud 2006-12-22
  • 打赏
  • 举报
回复
while read a1 a2 a3 a4
do
grep -q "$a3" file2
if [ $? == 0 ]
then
incount=`expr $incount + 1`
else
newcount=`expr $newcount + 1`
fi
done < $file1
注意[]的空格,不过似乎比你的效率不高,不过有可能因为不用写入 /dev/null效率稍微有些提高

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧