周末这两天在家用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. 第一章 Linux系统介绍与环境搭建准备

    1.操作系统: Operating System,简称OS,它是应用程序运行以及用户操作必备的基础环境支撑,是计算机系统的核心. 操作系统就是处于用户与计算机系统硬件之间用于传递信息的系统程序软件. ...

  2. Java钉钉开发_03_通讯录管理之 人员管理 和 部门管理

    一.本节要点 1.通讯录权限 ISV(应用服务商)默认无管理通讯录的权限,企业应用默认有所有通讯录权限. 2.数据传输格式—JSON 请参见: Java_数据交换_fastJSON_01_用法入门 二 ...

  3. 关于帧动画steps属性的理解

    CSS3的Animation有八个属性 animation-name animation-duration animation-delay animation-iteration-count anim ...

  4. canvas画布实现手写签名效果

    最近项目中涉及到移动端手写签名的功能需求,将实现代码记录于此,供小伙伴们参考指摘哦~ HTML代码: <!--手写区--> <div class="mSign_signMa ...

  5. C#去掉字符串头尾指定字符

    private void button2_Click(object sender, EventArgs e)        {//去掉字符串头尾指定字符            string MyInf ...

  6. .NET读取Excel文件的三种方法的区别

    ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...

  7. DbContext 和ObjectContext

    近日学习新知识,用到CallContext数据槽,一直使用ObjectContext 但同时又在学习EF CodeFirst,上下文定义使用的 DbContext 这时问题来了,如何把DbContex ...

  8. 前端框架:react还是vue?

    之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...

  9. ASP.NET Core缓存静态资源

    背景 缓存样式表,JavaScript或图像文件等静态资源可以提高您网站的性能.在客户端,总是从缓存中加载一个静态文件,这样可以减少对服务器的请求数量,从而减少获取页面及其资源的时间.在服务器端,由于 ...

  10. 利用docker搭建spark hadoop workbench

    目的 用docker实现所有服务 在spark-notebook中编写Scala代码,实时提交到spark集群中运行 在HDFS中存储数据文件,spark-notebook中直接读取 组件 Spark ...