gpt4 book ai didi

Python多处理设计

转载 作者:IT老高 更新时间:2023-10-28 21:05:03 24 4
gpt4 key购买 nike

我编写了一个算法,它获取地理空间数据并执行多个步骤。输入数据是大型栅格研究区域(约 1.5 亿像素)的多边形和协变量栅格的 shapefile。步骤如下:

  1. shapefile 多边形内的采样点
  2. 对于每个采样点,从协变量栅格中提取值
  3. 在采样点上构建预测模型
  4. 为目标网格点提取协变量
  5. 将预测模型应用于目标网格
  6. 将预测写入一组输出网格

整个过程需要迭代多次(比如 100 次),但目前在串行处理时,每次迭代需要一个多小时。对于每次迭代,最耗时的部分是第 4 步和第 5 步。由于目标网格非常大,我一直在一次处理一个 block (比如 1000 行)。

我有一个 6 核 CPU 和 32 Gb RAM,所以在每次迭代中,我尝试使用 Python 的 multiprocessing 模块和一个 Pool 对象来处理同时处理多个 block (步骤 4 和 5),然后使用调用全局输出写入函数的回调函数将输出(预测)写入公共(public)输出网格集。这似乎可行,但并不比串行处理每个 block 更快(实际上,它可能更慢)。

所以我的问题是,有没有更有效的方法呢?我对多处理模块的 Queue 类感兴趣,但我不确定它是如何工作的。例如,我想知道让一个队列执行第 4 步和第 5 步然后将结果传递给另一个执行第 6 步的队列是否更有效。或者这甚至是队列的用途吗?

任何指针将不胜感激。

最佳答案

Python 的多处理能力的当前状态对于 CPU 密集型处理来说并不是很好。我害怕告诉你,使用 multiprocessing 模块无法让它运行得更快,问题也不是你使用 multiprocessing 造成的。

真正的问题是 Python 仍然受制于 GlobalInterpreterLock(GIL) 的规则。 (我强烈建议 slides )。有一些令人兴奋的理论和experimental advances关于 GIL 的工作。 Python 3.2 事件包含一个新的 GIL,它解决了一些问题,但引入了其他问题。

目前,使用单个串行线程执行多个 Python 进程比尝试在一个进程中运行多个线程要快。这将允许您避免在线程之间获取 GIL 的问题(通过有效地拥有更多 GIL)。然而,这只有在您的 Python 进程之间的 IPC 开销不超过处理的好处时才有用。

Eli Bendersky 写了一篇不错的 overview article关于他尝试通过多处理使受 CPU 限制的进程运行得更快的经验。

值得注意的是PEP 371希望通过引入 multiprocessing 模块(以前是一个名为 pyProcessing 的非标准封装)来“绕过” GIL。然而,GIL 似乎仍然在 Python 解释器中扮演了太大的角色,无法使其与 CPU 绑定(bind)算法一起工作。许多不同的人都致力于删除/重写 GIL,但没有足够的吸引力使其成为 Python 版本。

关于Python多处理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10843240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com