MemoryError: unable to allocate array with shape and data type float32 while using word2vec in python

MemoryError: unable to allocate array with shape and data type float32 while using word2vec in python

我正在尝试从维基百科文本数据训练 word2vec 模型,为此我使用了以下代码。

import logging
import os.path
import sys
import multiprocessing

from gensim.corpora import  WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence


if __name__ == '__main__':
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # check and process input arguments

    if len(sys.argv) < 3:
        print (globals()['__doc__'])
        sys.exit(1)
    inp, outp = sys.argv[1:3]

    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())

    # trim unneeded model memory = use (much) less RAM
    model.init_sims(replace=True)

    model.save(outp)

但是在 20 分钟的程序 运行 之后,我出现了以下错误

Error message

理想情况下,您应该将错误的 text 粘贴到您的问题中,而不是屏幕截图。但是,我看到了两个关键行:

<TIMESTAMP> : INFO : estimated required memory for 2372206 words and 400 dimensions: 8777162200 bytes
...
MemoryError: unable to allocate array with shape (2372206, 400) and data type float32

在对您的语料库进行一次遍历后,该模型了解了有多少独特的词将存活下来,这报告了必须分配多大的模型:一个大约 8777162200 bytes(约 8.8GB)。但是,当尝试分配所需的向量数组时,您会得到 MemoryError,这表明没有足够的计算机可寻址内存 (RAM) 可用。

您可以:

  1. 运行 有更多内存的地方,可能是通过向现有系统添加 RAM;或
  2. 减少所需的内存量,主要是通过减少您要训练的唯一词向量的数量或它们的维度大小。

您可以通过将默认 min_count=5 参数增加到 min_count=10min_count=20min_count=50 之类的参数来减少字数。 (您可能不需要超过 200 万个单词向量——仅使用几万个单词的词汇表就可以获得许多有趣的结果。)

您还可以设置一个 max_final_vocab 值,以指定要保留的唯一单词的确切数量。例如,max_final_vocab=500000 将只保留 500000 个最常用的词,而忽略其余词。

减少 size 也将节省内存。 size=300 的设置在词向量中很流行,可以将内存需求减少四分之一。

一起,使用 size=300, max_final_vocab=500000 应该 trim 所需的内存低于 2GB。

我在处理pandas数据帧时遇到了同样的问题,我通过将float64类型转换为unint8解决了这个问题(当然对于那些不一定需要是float64的,你可以尝试float32而不是64)

数据['label'] = 数据['label'].astype(np.uint8)

如果遇到转换错误

数据['label'] = 数据['label'].astype(np.uint8,errors='ignore')

我不知道它在这种情况下是否有效,但您可以通过使用 SSD 中的 space 来增加系统中的虚拟 RAM 量。 当 运行 算法所需的 RAM 太高时,它在不同的项目中对我有用。

-转到“开始”菜单并单击“设置”。 -类型性能。 -选择调整 Windows 的外观和性能。 - 在新的 window 中,转到“高级”选项卡,然后在“虚拟内存”部分下,单击“更改”。 - 在新 window 的底部,检查推荐值是什么以及它与当前分配的值相比如何。 你可以超过推荐值

在尝试修改虚拟内存和 re-installing python 等许多修复之后,对我有用的是将 numpy dtype 从默认的 float64 修改为 float32。