python - 使用 python 3.6 将多个文件并行加载到内存中的最佳方法是什么?
问题描述
我有 6 个大文件,每个文件都包含一个字典对象,我使用 pickle 函数将其保存在硬盘中。按顺序加载所有这些大约需要 600 秒。我想同时开始加载所有这些以加快进程。假设它们都具有相同的大小,我希望在 100 秒内加载它们。我使用 multiprocessing 和 apply_async 分别加载它们中的每一个,但它像顺序一样运行。这是我使用的代码,它不起作用。该代码适用于其中 3 个文件,但其中 6 个文件相同。我将第三个文件放在另一个硬盘中以确保 IO 不受限制。
def loadMaps():
start = timeit.default_timer()
procs = []
pool = Pool(3)
pool.apply_async(load1(),)
pool.apply_async(load2(),)
pool.apply_async(load3(),)
pool.close()
pool.join()
stop = timeit.default_timer()
print('loadFiles takes in %.1f seconds' % (stop - start))
解决方案
如果您的代码主要受 IO 限制并且文件位于多个磁盘上,您可以使用线程来加速它:
import concurrent.futures
import pickle
def read_one(fname):
with open(fname, 'rb') as f:
return pickle.load(f)
def read_parallel(file_names):
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = [executor.submit(read_one, f) for f in file_names]
return [fut.result() for fut in futures]
GIL不会强制 IO 操作序列化运行,因为 Python 在执行 IO 时会始终释放它。
关于替代品的几点评论:
推荐阅读
- flutter - 我想在调用小部件时获得颜色
- node.js - 基于上一个关于 discord.js 依赖的问题
- bert-language-model - 拥抱脸——在本地保存微调的模型——还有分词器?
- python - 在 django 模板上调用具有多个参数的模型方法
- pandas - 如何按小时进行插值
- python - 从python中的排序列表中过滤字符串
- javascript - 来自反应形式的未定义输入
- html - Css,Html:为什么chrome会忽略容器宽度?(在所有其他浏览器上工作正常)
- graphql - Apollo Server:如何在没有指令的情况下对所有“id:ID”字段进行后处理?
- python - 如何在 pyqt5 图中添加十字准线