python - 在 Python 中使用多处理处理大文件:如何每个进程只加载一次资源?
问题描述
Python 的multiprocessing.Pool.imap
逐行处理大文件非常方便:
import multiprocessing
def process(line):
processor = Processor('some-big.model') # this takes time to load...
return processor.process(line)
if __name__ == '__main__':
pool = multiprocessing.Pool(4)
with open('lines.txt') as infile, open('processed-lines.txt', 'w') as outfile:
for processed_line in pool.imap(process, infile):
outfile.write(processed_line)
如何确保Processor
上面示例中的帮助程序只加载一次?如果不求助于涉及队列的更复杂/冗长的结构,这是否可能?
解决方案
multiprocessing.Pool
允许通过initializer
和initarg
参数进行资源初始化。我惊讶地发现这个想法是利用全局变量,如下图所示:
import multiprocessing as mp
def init_process(model):
global processor
processor = Processor(model) # this takes time to load...
def process(line):
return processor.process(line) # via global variable `processor` defined in `init_process`
if __name__ == '__main__':
pool = mp.Pool(4, initializer=init_process, initargs=['some-big.model'])
with open('lines.txt') as infile, open('processed-lines.txt', 'w') as outfile:
for processed_line in pool.imap(process, infile):
outfile.write(processed_line)
multiprocessing.Pool
的文档中没有很好地描述这个概念,所以我希望这个例子对其他人有所帮助。
推荐阅读
- ios - 将完成处理程序添加到函数 swift
- javascript - Angular 4:使用 SystemJS 的 Gulp 构建任务返回错误 ENOENT
- python - 停止自动打印控制台中的表达式评估
- firebase - 允许管理员用户读/写所有其他用户的firebase安全规则会造成安全漏洞?
- google-cloud-firestore - 如何使用 prettier 之类的工具格式化 firestore.rules 文件?
- javascript - 尝试循环图像但第一次单击后不更新
- c++ - 将超出范围的整数分配给带符号的 char 类型
- python - 在 Tkinter 中引用组合框值
- xcode - 在 Xcode 中解释能级
- php - 消息:未定义的偏移量:上传图像中的 1