我有以下问题。
我的目的是处理一堆文件(把所有的单词带到正常的形式,例如'是' - >'是','是' - >'是','去' - >'去' )。
这意味着,我需要打开目录中的每个文件,更改其内容并将其保存在其他目录中
由于这个过程非常耗时,我决定在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。文档非常小,并且在没有并行性的情况下运行时内存消耗很少。
答案 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)