草庐IT

Python多处理设计

coder 2023-05-26 原文

我编写了一个算法,它获取地理空间数据并执行多个步骤。输入数据是大型栅格研究区域(约 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/

有关Python多处理设计的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  8. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  9. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  10. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

随机推荐