标签:
周末这两天在家用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);
所以应该把上面的代码修正为:
int topic = (int)(((double)random() / (RAND_MAX+1)) * K);
int topic = (int)(((double)rand() / (RAND_MAX+1)) * K);
问题2:内存泄露
内存泄露主要发生在class model的析构函数中,即model::~model()中。产生的原因很简单,作者对于向量的内存释放,用的是delete,而正确的应该用delete []。
例如,原始代码:
if (nw) { for (int w = 0; w < V; w++) { if (nw[w]) { delete nw[w]; } } }
if (nw) { for (int w = 0; w < V; w++) { if (nw[w]) { delete [] nw[w]; //!!! } } } delete [] nw; //!!!
完。
转载请注明出处:http://blog.csdn.net/xceman1997/article/details/46405597
【LDA】修正 GibbsLDA++-0.2 中的两个内存问题
标签:
原文地址:http://blog.csdn.net/xceman1997/article/details/46405597