带有多处理池的多个只读对象的共享内存

时间:2019-01-24 14:01:23

标签: python multiprocessing jupyter-notebook shared-memory gensim

我正在计算机上使用训练有素的FastText模型创建文档向量。据我所知,Gensim的FastText没有创建文档矢量的选项(最好称为段落矢量[PV])。因此,我通过取文档中可用单词的总和的平均值来手动计算它们。仅此一项任务就不需要花费很多时间。

如果我要将其他几个数字特征附加到计算出的PV,则500万文档需要大约30分钟的创建时间。我认为可以通过使用Python的多处理库将工作分解到计算机上的几个内核上来改善此过程,该库现在可以运行,但只能在一定程度上使用。

在进入此阶段之前,我必须解决一些问题。由于我使用Jupyter Notebook执行代码,因此必须将一些方法放在单独的Python脚本中才能在Jupyter Notebook中使用多处理。这是Jupyter Notebook中可用的代码。它导入模块“ m_helpers”,该模块具有以下方法 创建文档向量:

import multiprocessing
import m_helpers

# Define number of workers.
num_processes = 3

if __name__ == "__main__":
    # This pool spawns several processes to built the
    # document vectors with the FastText model
    with multiprocessing.Pool(processes = num_processes, 
                              initializer = m_helpers.init_vars, 
                              initargs = (fasttext_model, vars_df)) as pool:
        results = pool.map(m_helpers.create_docvecs,
                           data_df.itertuples(name = False), 
                           chunksize = 512)
        output = [x for x in results]

    # Print length of output to see whether everything was processed
    print("Length of output (document vectors): {0}".format(len(output)))

m_helpers.py:

fasttext_model = None
vars_df = None

def init_vars(model, df):
    global fasttext_model
    fasttext_model = model
    global vars_df
    vars_df = df

def create_docvecs(data):
    word_vectors = [fasttext_model.wv[word] for word in data[-1].str.split()]
    document_vector = sum(word_vectors) / len(word_vectors)
    feature_vector = vars_df.loc[data[0], :].values
    # Further code to combine both vectors
    return document_vector

我有一台6核/ 12线程的计算机。但是,我可以使此代码仅适用于3个内核。使用更多内核通常会导致由于耗尽所有内存(RAM)而导致错误。我认为这是由每个过程的所有对象副本造成的。

现在,似乎已经有一种方法可以创建一个供所有进程访问的共享内存。我正在遍历一个数据框以访问文本数据。为所有进程调用的方法使用另一个数据框和快速文本模型。所有这些对象都是只读的,以创建PV并从其他数据帧附加值。我可以合并文本数据框和要素数据框。但是,我仍然至少需要共享fasttext_model对象。所以问题是,怎么做?有可能吗?我已经在stackoverflow上阅读了有关此问题的几个问题,但是我做不到。也许我需要使用不同于Pool的东西?

0 个答案:

没有答案