是否可以使用多线程访问快速文本模型(gensim)?当前,由于大小和加载时间的缘故,我试图加载一次模型,因此该模型保留在内存中,并且连续数千次访问其相似性函数。我想并行执行此操作,并且我当前的方法使用包装类来加载模型,然后将其传递给工作人员。但是看起来它没有返回任何结果。
包装器类。发起一次。
from gensim.models.fasttext import load_facebook_model
class FastTextLocalModel:
def __init__(self):
self.model_name = "cc.de.300.bin"
self.model_path = path.join("data", "models", self.model_name)
self.fast_text = None
def load_model(self):
self.fast_text = load_facebook_model(self.model_path)
def similarity(self, word1: str = None, word2: str = None):
return self.fast_text.wv.similarity(word1, word2)
并且Processor类使用上面的FastTextLocalModel
方法:
fast_text_instance = FastTextLocalModel()
fast_text_instance.load_model()
with concurrent.futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count()) as executor:
docs = corpus.get_documents() # docs is iterable
processor = ProcessorClass(model=fast_text_instance)
executor.map(processor.process, docs)
使用max_workers=1
似乎有效。我不得不提到我在python多线程方面没有专门知识。
在此先前的回答中可能对您有用,可能需要适应FastText
和gensim
的最新版本:
https://stackoverflow.com/a/43067907/130288
(键是...
即使关键内存消耗阵列被mmap
填充并因此在操作系统级别自动共享,即使在不同进程中进行冗余加载也可能不会使用冗余内存;和
..但是FastText
代码中的混乱可能会使这些操作变得更加困难。)