金山软件的一道笔试题-日志分析解决方案

金山软件的一道笔试题--日志分析
有一个日志文件,每行记录了一次调用信息,其中包括时间和来源IP。每天的记录数目大约10亿条左右。现在需要:
1)获取日访问次数最高的1000个来源IP,按照访问量从高到低排序。
2)获取连续一周内访问次数最高的1000个来源IP,按照访问量从高到低排序。
请给出能得到精确(非近似)结果,并且效率尽可能高的计算方法,并给出主要部分伪代码。

------解决方案--------------------
用堆的方式保存源地址信息,每个节点的结构为
typedef unsigned long U32;
struct NODE
{
U32 ip; //源IP地址
U32 visitToday; //本日访问次数
U32 visitThisWeek; //本周访问次数
};


伪码:

U32 ip;
TIME time;

//以ip为key建立堆
ret = ReadLine(&ip, &time);
while (ret != EOF)
{
struct NODE *q = binarySearchWithIp(ip);
if (NULL == q)
{
q = GetHeapTailNode();
q->ip = ip;
q->visitToday = 0;
q->visitThisWeek = 0;
AdjustHeapWithIp();
}
if (IsToday(time)) (p->visitToday)++;
is (IsThisWeek(time)) (p->visitThisWeek)++;

ret = ReadLine(&ip, &time);
}

//以visitToday为Key对堆进行重新排序,只要排出前1000个即可
SortHeapTopNWithVisitToday(1000);
PrintHeapTopN(1000);

//以visitThisWeek为Key对堆进行重新排序,只要排出1000个即可
SortHeapTopNWithVisitThisWeek(1000);
PrintHeapTopN(1000);

------解决方案--------------------
数据量这么大,无论是用什么工具去处理都是不太好处理的. 

我想法: 
1) 它是按时间来进行统计的.所以,第一步,我觉得需要把这个十几亿或者是过百亿行的文件拆分了多个文件.可以按每小时或者每半小时为一个文件
2) 当拆分了多个文件后,每个文件中的IP进行统计,并且记录在持久性介质中
3) 重持久性介质中,再通过 Hash 等方式来进行排序 

总结: 到了10亿这个层面上,常用算法都是变得相当无力.
我思想是现实有限硬件条件下,可以对大数据量处理进行拆分,统计,再重组来处理.
若假象在无限制硬件条件下,哈希的方式应该是最快吧.