Joblib的内存使用量不断增长。

8
我有以下问题。 我的目的是处理一些文件(将所有单词转换为常规形式,例如'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转换为multiprocessing:

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

然而,情况却完全相同。

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

谢谢!

P.S. 当不使用并行处理时,这些文档非常小,并且该过程消耗的内存很少。


对于多进程,您可以显式终止所有生成的进程。 对于joblib,我遇到了同样的问题。 - Ivan Sudos
2个回答

1
似乎这个内存泄漏问题已经在最新版本的Joblib中得到解决。
他们引入了loky后端作为内存泄漏保护措施。
Parallel(n_jobs=10, backend='loky')(delayed(process_and_save)(doc_id) for doc_id in all_doc_ids)

来源:并行后的内存释放


0

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

作为解决方法,您可以分块读取文件。请参见Python中读取大文件的惰性方法?


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接