Joblib内存使用量不断增长

时间:2017-06-08 10:12:12

标签: python-2.7 memory parallel-processing pool joblib

我有以下问题。 我的目的是处理一堆文件(把所有的单词带到正常的形式,例如'是' - >'是','是' - >'是','去' - >'去' )。 这意味着,我需要打开目录中的每个文件,更改其内容并将其保存在其他目录中 由于这个过程非常耗时,我决定在joblib的帮助下将其并行化。 下面的代码工作正常(我的意思是,它执行它所拥有的),但我遇到了很大的内存问题 不断增长!
它一直在增长,直到服务器上根本没有内存。

from joblib import delayed, Parallel

def process_text(text):
    # some function which processes
    # text and returns a new text
    return processed_text


def process_and_save(document_id):
    with open(path + document_id) as f:
        text = f.read()
    text = process_text(text)
    f = open(other_path + document_id, 'w')
    f.write(text)
    f.close()

all_doc_ids = # a list of document ids which I need to process

Parallel(n_jobs=10)(delayed(process_and_save)(doc_id) for doc_id in all_doc_ids)

我也尝试将joblib更改为多价格:

pool = Pool(10)
pool.map(process_and_save, all_doc_ids) 

但事实证明情况完全相同。

有什么方法可以解决这个问题吗?当然,主要的问题是,为什么会发生这种情况呢?

谢谢!

P.S。文档非常小,并且在没有并行性的情况下运行时内存消耗很少。

2 个答案:

答案 0 :(得分:0)

并行处理所有文档时,每个线程都会将整个文件加载到内存中,因为read()从内存中的整个文件中创建了一个字符串。

作为一种解决方法,您可以分块读取文件。参见Lazy Method for Reading Big File in Python?

答案 1 :(得分:0)

似乎此内存泄漏问题已在Joblib的最新版本中得到解决。

它们引入了不稳定的后端作为内存泄漏保护措施。

Parallel(n_jobs=10, backend='loky')(delayed(process_and_save)(doc_id) for doc_id in all_doc_ids)

来源:Memory Release after parallel