Joblib 内存使用量不断增长

Posted

技术标签:

【中文标题】Joblib 内存使用量不断增长【英文标题】:Joblib memory usage keeps growing 【发布时间】:2017-11-09 23:58:12 【问题描述】:

我有以下问题。 我的目的是处理一堆文档(将所有单词转换为正常形式,例如'was' --> 'be'、'were' --> 'be'、'went' --> 'go')。 这意味着,我需要打开一个目录中的每个文件,更改其内容并将其保存在另一个目录中。 由于这个过程很耗时,我决定在 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改成multipricessing:

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

但情况却一模一样。

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

谢谢!

附:文档非常小,并且在没有并行性的情况下运行时进程消耗的内存非常少。

【问题讨论】:

对于多处理,您可以显式终止所有生成的处理。对于joblib,我有同样的问题 【参考方案1】:

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

他们引入 loky 后端作为内存泄漏保护措施。

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

来源:Memory Release after parallel

【讨论】:

【参考方案2】:

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

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

【讨论】:

我建议也逐行阅读,而不是将整个文件加载到内存中

以上是关于Joblib 内存使用量不断增长的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 C++ 程序的内存使用量不断增长?

Dask Worker 进程内存不断增长

在多线程环境中使用 PyCurl 时程序消耗的内存不断增长

内存使用量随着 Python 的 multiprocessing.pool 不断增长

python 使用joblib在内存中存储和检索对象

为什么我的C ++程序的内存使用量不断增长?