周末这两天在家用LDA做个小实验。

在LDA的众多实现的工具包中。GibbsLDA 是应用最广泛的。包含c++版本号、java版本号等。GibbsLDA++ 是它的C++版本号的实现。眼下最新版本号是0.2版。在实际使用过程中。发现这个实现版本号有内存使用问题。我花了一些时间定位到了问题,贴出来供大家參考。

问题1:数组内存訪问越界

在model.cpp中。用到了两个矩阵nw和nd。分别存储word-topic关系和document-topic关系。这两个矩阵的大小各自是V * K和 M * K,当中,V是词表大小。M是文档个数。K是topic的个数。在sampling的过程中。用随机数产生器来随机产生topic相应的索引。源程序例如以下:

int topic = (int)(((double)random() / RAND_MAX) * K);

原则上,topic的索引的取值范围是[0,K-1],只是,上面那行程序。函数random()的取值能够是RAND_MAX。也就是说上述语句产生的topic索引的范围是[0,K],当产生的索引是K的时候,在接下来的运算中,发生数组越界訪问。

所以应该把上面的代码修正为:

int topic = (int)(((double)random() / (RAND_MAX+1)) * K);

我实际上是在windows上面用的。windows不支持random()函数,所以改成rand()函数,例如以下:

int topic = (int)(((double)rand() / (RAND_MAX+1)) * K);

当然,srandom()也要改成srand()。

问题2:内存泄露

内存泄露主要发生在class model的析构函数中,即model::~model()中。产生的原因非常easy。作者对于向量的内存释放,用的是delete,而正确的应该用delete []。

比如,原始代码:

if (nw) {
for (int w = 0; w < V; w++) {
if (nw[w]) {
delete nw[w];
}
}
}

如之前所述。nw是一个矩阵。

正确代码是:

if (nw) {
for (int w = 0; w < V; w++) {
if (nw[w]) {
delete [] nw[w]; //!!!
}
}
}
delete [] nw; //!!!

改动了上面两个问题之后。GibbsLDA++-0.2在机器上跑的就非常顺畅了。——事实上不修正也能跑出结果来:对于内存訪问越界,次数并不多,所以影响不大;对于内存泄露。进程退出的时候OS会自己主动清理改进程所用的内存空间,所以也影响不大。

这可能也是这个工具包被这么多人(主要是研究人员)使用,而没人去修正这个问题的解决办法吧。

完。

转载请注明出处:http://blog.csdn.net/xceman1997/article/details/46405597

【LDA】修正 GibbsLDA++-0.2 中的两个内存问题的更多相关文章

  1. JavaScript中的两个“0” -0和+0

    JavaScript中的两个“0”(翻译)   本文翻译自JavaScript’s two zeros JavaScript has two zeros: −0 and +0. This post e ...

  2. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  3. Crystal Report在.net中的两种显示方式

    Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...

  4. OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out

           OpenGL ES和OpenGL的图标 关于“OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out”这个问题,做一阐述: 1.关键字的小修 ...

  5. MySQL中的两种临时表

    MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...

  6. 在VC++6.0开发中实现全屏显示

    全屏显示是一些应用软件程序必不可少的功能.比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态. ...

  7. Visual Studio 2010(.NET 4.0)中使用SQLite.NET

    Visual Studio 2010(.NET 4.0)中使用SQLite.NET   2011年4月1日 | 分类: DataBase, DOTNET | 标签: .net 4.0, SQLite. ...

  8. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  9. [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数

    一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...

随机推荐

  1. 28.Linux-IIC驱动(详解)

    上一节 我们学习了: IIC接口下的24C02 驱动分析: http://www.cnblogs.com/lifexy/p/7793686.html 接下来本节, 学习Linux下如何利用linux下 ...

  2. 使用SuperSocket打造逾10万长连接的Socket服务

    SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作 ...

  3. ML技术 - 特征选择

    1. 决策树中的特征选择 分类决策树是一种描述对实例进行分类的树型结构,决策树学习本质上就是从训练数据集中归纳出一组分类规则,而二叉决策树类似于if-else规则.决策树的构建也是非常的简单,首先依据 ...

  4. 两个Xml转换为DataSet方法(C#)

    ///通过传入的特定XML字符串,通过 ReadXml函数读取到DataSet中.protected static DataSet GetDataSetByXml(string xmlData){   ...

  5. 如何添加title左侧的图标

    在titile标签上方插入以下代码,图片要求格式必须是.ico. <link rel="shortcut icon" href="images/favicon.ic ...

  6. 【Java入门提高篇】Day1 抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  7. 这次真的忽略了一些ActiveMQ内心的娇艳

    好久没总结了,内心有点空虚了,所以今天主要给园里的朋友们分享一点儿这几天使用ActiveMQ过程中踩过的小坑,虽然说这东西简单易用,代码几行配置也就几行,问题不大但是后果有点严重,所以就要必要总结一下 ...

  8. kali 2.0中msf连接postgres数据库

    装好kali 2.0后直接运行msfconsole msf> db_status postgres selected, no connection 百度到的解决方法多是针对BT和kali 1.0 ...

  9. 开始python成长之路

    因为某种特殊原因很不幸的得了脱髓鞘 正要去实习 大展身手 甚至公司都选好了 可就在这个节骨眼..得了传说中的脱髓鞘.经过一年的修养 我决定还是要站起来 毕竟一生的时间很长 这一段时间 我都在玩游戏赚钱 ...

  10. [读书笔记]javascript语言精粹'

    人比较笨,以前只做项目,案例,然而一些javascript的很多理论不知道该怎么描述,所以最近开启一波读书之旅: 标识符 1.定义 标识符以字母开头,可能后面跟上一个或多个字母.数字或者下划线. 2. ...