Chinaunix首页 | 论坛 | 博客
  • 博客访问: 544735
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:30:37

1 现象:问题描述
在S省XX项目的现场测试发现,话单预处理程序占用内存经常会随着运行时间而不断增大,而且当话单中重复话单较多的情况下,系统占用内存增长速度明显会快很多,必须隔两天重起一次程序,重起后系统恢复正常,但是还是存在内存泄漏现象。
2 关键过程:根本原因分析
处理过话单的同事都知道,话单剔重是系统处理的一个难点,一方面是海量数据,一方面要求系统性能,要在时间效率和空间效率中找到平衡,平衡二叉树算法是其中常用的算法。
这个问题就在于这段自己书写的平衡二叉树算法上,代码在一开始就为输入的节点动态申请了的堆空间,但是发现这是一条重复话单后,因为并不需要更新二叉树,系统就直接返回了,但是申请的堆空间并没有释放,导致这部分内存泄漏了。
因为代码较长,此处略。
3 结论:解决方案及效果
当然在泄漏处增加内存释放语句问题也就解决了,这里想说明关键点的并不是如何修改这部分代码。其实大部分人都知道STL标准模板库,相关的书籍也有很多,但是真正应用的较少,比如刚才的剔重算法,使用map,下面一段代码就解决了剔重问题。
 map::iterator iteNode;
 iteNode = m_mapCol.find(strKey);
 if(m_mapCol.end() == iteNode)
 {
  //没有找到相应的key值
  //先判断是否超出上限
  if(m_nRecCount >= m_nMaxNodeSum)
  {
   FreeMap();
   m_nRecCount = 0;
  }
  m_mapCol.insert(map::value_type(strKey,stMapNode));
  //记录数目加1
  m_nRecCount++;
  return SUCC;
 }
 STMapNode *pstNode;
 pstNode = &(iteNode->second);
 if((stMapNode.nStartTime >= pstNode->nEndTime)
     || (stMapNode.nEndTime<=pstNode->nStartTime))
 {
  //不是重复话单
  if(stMapNode.nStartTime >= pstNode->nEndTime)
  {
   //需要更新时间
   pstNode->nStartTime = stMapNode.nStartTime;
   pstNode->nEndTime = stMapNode.nEndTime;
  }
 }
 else
 {
  //重复话单
  nIsCollision = 1;
 }
经过测试,使用map的效率与原来平衡二叉树的效率基本一样。map使用的红黑树技术,效率与平衡二叉树相仿,在特定应用下效率还要好于平衡二叉树。
4 经验总结:预防措施和规范建议
STL模板帮大家管理了内存,只要按照模板要求使用,能够快速实现各种算法和数据结构功能要求,而且不需要考虑内存泄漏问题,应该在编码中积极推广。但是使用前一定要深入了解各种模板,才能达到事半功倍的效果。
此处仅针对刚才的案例提到的文件内部的剔重算法,对于通用情况下,特别是上千万级的话单量,要考虑内存换页技术。
5 备注
6 考核点
对STL模板库的理解。
7 试题
以下那些STL标准模板的定义是正确的(ABC)
A、 map m_mapType;
B、 list m_listCallerCalled;
C、 string m_strCaller;
D、 以上都不正确
阅读(305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~