【LDA】修正 GibbsLDA++-0.2 中的两个内存问题
周末这两天在家用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 中的两个内存问题的更多相关文章
- JavaScript中的两个“0” -0和+0
JavaScript中的两个“0”(翻译) 本文翻译自JavaScript’s two zeros JavaScript has two zeros: −0 and +0. This post e ...
- 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)
[Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...
- Crystal Report在.net中的两种显示方式
Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...
- OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out
OpenGL ES和OpenGL的图标 关于“OpenGL ES SL 3.0规范中以前的attribute改成了in varying改成了out”这个问题,做一阐述: 1.关键字的小修 ...
- MySQL中的两种临时表
MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...
- 在VC++6.0开发中实现全屏显示
全屏显示是一些应用软件程序必不可少的功能.比如在用VC++编辑工程源文件或编辑对话框等资源时,选择菜单“View\Full Screen”,即可进入全屏显示状态,按“Esc”键后会退出全屏显示状态. ...
- 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. ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数
一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...
随机推荐
- MQTT——订阅报文
我们已经把相关的连接报文搞定了.笔者想来想去还是决定先讲解一下订阅报文(SUBSCRIBE ).如果传统的通信方式是客户端和服务端之间一般就直接传输信息.但是MQTT的通信方式是通过发布/订阅的方式进 ...
- linux-rmdir
linux-rmdir rmdir命令用于删除空目录,删除的目录的里面必须无任何东西,有点鸡肋的命令 从下面先建立了一个a文件夹. 命令: rmdir a,即可删除这个空目录,ls 就找不到这个文件夹 ...
- linux 更新源miss问题
1.之前新装的linuxMint 执行 apt-get install vim 安装失败 发现原因是源更新失败导致,后来执行apt-get update 发现老是获取失败,查了google总结出以下解 ...
- C#获取存储过程的 Return返回值和Output输出参数值
1.获取Return返回值 程序代码 //存储过程//Create PROCEDURE MYSQL// @a int,// @b int//AS// return @a + ...
- [转载] linux中文件描述符fd和文件指针flip的理解
转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
- [转载] ETL和Kettle
http://tech.ccidnet.com/art/1105/20080407/1411567_1.html http://blog.csdn.net/cissyring/article/deta ...
- 什么是Node.js?带你初识Node
什么是Node.js Nodejs是一个基于Chrome v8引擎的JavaScript运行环境 Node.js使用了一个事件驱动,非阻塞式I/O的模型,使其轻量又高效. Node.js 的包管理器 ...
- 天龙八步"细说浏览器输入URL后发生了什么
本文摘要: 1.DNS域名解析: 2.建立TCP连接: 3.发送HTTP请求: 4.服务器处理请求: 5.返回响应结果: 6.关闭TCP连接: 7.浏览器解析HTML: 8.浏览器布局渲染: 总结 输 ...
- python 标准模块shlex
shlex模块为基于Uninx shell语法的语言提供了一个简单的lexer(也就是tokenizer) 举例说明: 有一个文本文件quotes.txt This string has embedd ...
- Spring4 AOP详解
Spring4 AOP详解 第一章Spring 快速入门并没有对Spring4 的 AOP 做太多的描述,是因为AOP切面编程概念不好理解.所以这章主要从三个方面详解AOP:AOP简介(了解),基于注 ...