Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Doc2vec存储器错误_Python_Memory_Gensim_Word2vec - Fatal编程技术网

Python Doc2vec存储器错误

Python Doc2vec存储器错误,python,memory,gensim,word2vec,Python,Memory,Gensim,Word2vec,我正在使用teh gensim框架中的doc2vec模型来表示一个包含15 500 000个短文档(最多300字)的语料库: 创建向量后,有超过18000000个向量表示单词和文档 我想查找给定项目最相似的项目(文字或文档): similarities = model.most_similar(‘uid_10693076’) 但当计算相似性时,我会得到一个记忆错误: Traceback (most recent call last): File "article/test_vecto

我正在使用teh gensim框架中的doc2vec模型来表示一个包含15 500 000个短文档(最多300字)的语料库:

创建向量后,有超过18000000个向量表示单词和文档

我想查找给定项目最相似的项目(文字或文档):

 similarities = model.most_similar(‘uid_10693076’)
但当计算相似性时,我会得到一个记忆错误:

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) 
有人能解释一下这个记忆错误的原因吗?在我看来,可用的内存应该足以进行这种计算。python或OS中可能存在一些内存限制


提前谢谢

18M向量*400维*4字节/浮点=28.8GB用于模型的syn0数组(训练向量)

syn1数组(隐藏权重)也将为28.8GB–尽管syn1实际上不需要文档向量的条目,而文档向量在训练期间从来都不是目标预测

词汇表结构(vocab dict和index2word表)可能会增加另一个GB或更多。这就是你所有的60GB内存

用于相似性计算的syn0norm数组还需要28.8GB,总使用量约为90GB。这是syn0norm创建,您将在其中获得错误。但即使syn0norm创建成功,那么深入虚拟内存也可能会破坏性能

一些可能有帮助的步骤:

  • 至少使用2分钟计数:出现一次的单词不太可能有多大作用,但可能会占用大量内存。(但由于单词只占syn0的一小部分,这只会节省一点点。)

  • 在训练后但在触发init_sims()之前,丢弃syn1数组。您将无法进行更多培训,但您现有的word/doc向量仍然可以访问

  • 在训练之后但调用most_similor()之前,使用replace=True参数自己调用init_sims(),以丢弃非规范化的syn0并用syn0norm替换它。同样,您将无法进行更多的训练,但您将节省syn0内存


正在进行的分离doc和word向量的工作,将出现在gensim过去的版本0.11.1中,最终也会提供一些缓解。(它会将syn1压缩为只包含单词条目,并允许文档向量来自文件备份(memmap'd)数组。)

我按照您的建议做了,设置了最小计数=2,消除了syn1数组,结果成功了:)。然而,你能解释一下为什么,如果我有60Gb的RAM和70Gb的交换(总共130Gb的内存),当系统需要大约90Gb的内存时,它却不能工作吗?gensim word2vec实现是否需要适应RAM中的所有信息?谢谢你!Gensim的word2vec需要可寻址空间中的结构,但不一定是RAM。尽管如此,您永远不想依靠交换来获取主动、随机访问的大数据。用于syn0和syn1的60GB RAM;30GB用于syn0norm(但另一个建议请参见上面新的第三个项目符号)–然后,most_similar()会临时使用30GB(但我认为一些即将发布的修复程序将允许使用较小的批处理)来计算每个向量的数组距离。在考虑任何其他内存使用/碎片/效率低下之前,这是120GB。即使有效,交换也可能会使性能变得糟糕。如何消除syn1数组?与其他Python对象属性一样,您可以使用
del
删除它,例如
del model.syn1
。(或者在更常见的情况下,如果使用负采样,因此只存在
syn1neg
del model.syn1neg
),但如前所述,这会破坏模型的一个重要部分,并且只有在您只查找单词/文档向量时才适用(从不重新训练或推断)。在这种情况下,gensim的最新版本允许您仅对向量集进行保存/加载/操作。(上面的答案是3岁以上。)
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) 
resource.getrlimit(resource.RLIMIT_MEMLOCK)