我正在使用来自teh gensim框架的doc2vec模型来表示一个包含1550万个短文档(最多300个单词)的语料库:
gensim.models.Doc2Vec(sentences, size=400, window=10, min_count=1, workers=8 )在创建向量之后,有超过18000个矢量代表文字和文档。
我想为某一特定项目找到最相似的项目(文字或文件):
similarities = model.most_similar(‘uid_10693076’)但是,当计算出相似点时,我得到了一个MemoryError:
Traceback (most recent call last):
File "article/test_vectors.py", line 31, in <module>
similarities = model.most_similar(item)
File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 639, in most_similar
self.init_sims()
File "/usr/local/lib/python2.7/dist-packages/gensim/models/word2vec.py", line 827, in init_sims
self.syn0norm = (self.syn0 / sqrt((self.syn0 ** 2).sum(-1))[..., newaxis]).astype(REAL) 我有一个60 and内存和70 and交换的Ubuntu机器。我检查了内存分配(在htop中),并注意到内存从未被完全使用过。我还将锁在python内存中的最大地址空间设置为无限:
resource.getrlimit(resource.RLIMIT_MEMLOCK)有人能解释一下MemoryError的原因吗?在我看来,可用的内存应该足够进行这种计算。可能是python或OS中的内存限制吗?
提前感谢!
发布于 2015-05-28 23:28:25
18M向量* 400维*4字节/浮点= 28.8GB模型的syn0数组(训练向量)
syn1数组(隐藏权重)也将是28.8GB --尽管syn1实际上不需要文档向量的条目,因为在训练过程中,文档向量从来不是目标预测。
词汇表结构( vocabulary和index2word表)可能会添加另一个GB或更多。这就是你所有的60‘s内存。
用于相似度计算的syn0norm数组还需要28.8GB,总使用量约为90 of。这是syn0norm创建的地方,您在那里得到了错误。但是,即使syn0norm创建成功,那么深入到虚拟内存中也可能会破坏性能。
一些可能有帮助的步骤:
在进行中的工作分离出文档和文字向量,这将出现在gensim过去的0.11.1节,最终也应该提供一些帮助。(它将缩小syn1,使其只包含word条目,并允许文档向量来自文件支持的(memmap'd)数组。)
https://stackoverflow.com/questions/30488695
复制相似问题