Python 在多处理中共享gensim(numpy)模型时发生系统错误

Python 在多处理中共享gensim(numpy)模型时发生系统错误,python,numpy,python-multiprocessing,gensim,word2vec,Python,Numpy,Python Multiprocessing,Gensim,Word2vec,我有许多独立的任务,可以读取但不能写入相同的gensim型号,该型号的大小约为3.6GB。(Gensim是一个基于numpy构建的主题建模库。)因此我决定通过首先从文件加载Gensim模型来并行化它们: from gensim.models.word2vec import Word2Vec from multiprocessing import Pool model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.b

我有许多独立的任务,可以读取但不能写入相同的gensim型号,该型号的大小约为3.6GB。(Gensim是一个基于numpy构建的主题建模库。)因此我决定通过首先从文件加载Gensim模型来并行化它们:

from gensim.models.word2vec import Word2Vec
from multiprocessing import Pool
model = Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
然后将
模型
作为参数传递给要运行
doWork的进程池

def doWork(experiment, doc):
  print "Begin working"
  # do some work here; access model by experiment.model

class Experiment(object):
   def __init__(self, model, docs):
     self.model = model
     self.docs = docs
   def run(self):
     pool = Pool(processes = 4)
     print "Done preparing"
     results = pool.map(doWork, [(self, doc) for doc in self.docs])
     return results

experiment = Experiment(model, ['doc1.txt', 'doc2.txt'])
experiment.run()
当我运行这个脚本时(我在这里显示的两段是可运行的脚本;请复制),它卡在
pool.map
行上,出现了
SystemError
。结果是:

Done preparing
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks
    put(task)
SystemError: NULL result without error in PyObject_Call
在我将gensim引入我的程序之前,这个错误从未发生过。(没有多处理的Gensim也适用于我。)我认为这可能与Gensim和numpy(BLAS)下面的C代码的互操作有关我想知道这个错误的原因以及如何修复。如果我不能在子流程中使用gensim,有什么替代方案


我不认为
模型会被复制,因为我的操作系统(MacOSX)应该使用写时复制策略。我认为这也与内存同步无关,因为没有打印一行“开始工作”,即
模型
未被我的代码访问。错误在于将
模型
传递给子进程。

也许?@boardrider您可能是对的。只是在本例中,我并不是自己编写C代码的——它是库的一部分。我无法找到问题所在,因为我不知道在启动子流程时执行了哪些C代码行(在我看来,没有,但这无法解释问题)。