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、 以上都不正确
阅读(327) | 评论(0) | 转发(0) |