- 论坛徽章:
- 0
|
问题已经解决了,同事找他算法的同学问的,给出了个点子,不错!
原来的做法是用 srcaddr | dstaddr | (srcport << 16)|dstport做哈希key值。
但是这个方法受数据影响很大,300万个节点要完全统计起来太慢了,有时完全会阻塞住。一分钟根本不够。
新的方法是:
每个缓冲区放300万个节点,然后五个缓冲区连接成一个环形链表,读线程同样遍历链表,讲从内存中读出的数据写入到缓冲区中,待缓冲区满了,然后进入下一个节点的填充,或者等待空闲缓冲区。
而处理线程,也是遍历链表,找到一个填满的缓冲区后,首先对缓冲区的300万个节点进行排序,使用qsort,排序后,300万个节点其实已经分好组了,相等的都靠在一起。这时,再遍历300万个节点一遍。把相等的节点的value值加起来,就完成合并了。每处理完一组值,就相当于生成了一个要汇报的节点(也就是说这组的节点合并成一个节点进行汇报了)。
这样做效率确实高。从昨天下午测试到现在,大概结果比较稳定,排序300万个5秒钟完成,遍历并且汇报节点,最多10秒左右,最小4,5秒,现在持续4秒钟。
这个结果确实出乎意外啊。很满意。
我会继续跟踪后续的问题,如果有新的进展,继续讨论。 |
评分
-
查看全部评分
|