Python 多处理和numpy,在线处理,同时避免复制

Python 多处理和numpy,在线处理,同时避免复制,python,numpy,multiprocessing,Python,Numpy,Multiprocessing,在numpy和共享阵列中使用多处理有很多问题。但在我看来,当应用程序启动时,它们都有数据可用的奢侈,这意味着可以轻松地对数据进行内存映射 相比之下,我试图构建一个框架,在这个框架中生成并处理数据 基本上我有一个管道,看起来像这样 Source --> Filter --> Destination | | | | | | ------------------------------>

在numpy和共享阵列中使用多处理有很多问题。但在我看来,当应用程序启动时,它们都有数据可用的奢侈,这意味着可以轻松地对数据进行内存映射

相比之下,我试图构建一个框架,在这个框架中生成并处理数据

基本上我有一个管道,看起来像这样

Source --> Filter --> Destination
   |          |            |
   |          |            |
   ------------------------------> Controller / GUI
源会发出新数据,在我的例子中,这些数据是来自存储为numpy.ndarray实例的视频流的图像。过滤器对数据进行计算,目标进行进一步计算。 控制器/GUI只是能够显示预览、当前进度等

我当前的设计是使源、筛选器和目标多处理.Process实例,然后我有多处理.Queue实例连接这些进程

但使用队列或管道共享数据意味着在每一步都要复制数据。如果可能的话,最好避免这些拷贝,因为我很确定还没有测量,尽管这会降低性能。 有没有合理的方法来避免这种情况

编辑,随机思考可能的解决方案 我想我真正想要的是某种共享内存池,在那里我可以存储图像,然后只传递对进程的引用。 例如:

源生成一个映像并将其存储在位置k的共享内存池中。 源发送在位置k处有一个新图像要过滤 两件事之一: 筛选器确定映像已损坏,并指示共享内存池删除位置k处的映像。 或者,过滤器确定图像正常,并将位置k处存在已过滤图像的消息发送到目标。 不过,如果有人已经这样做了,或者这确实是最好的答案,我不知道实施起来有多困难。
我想听听您的意见。

您可能已经成功地将numpy数据存储在一个或多个数据库中。您仍然需要处理与管理器来回序列化通信的性能影响,但如果您小心,至少可以避免在pickle/unpickle中泵送整个数据结构

编辑:


也许你看问题的方式不对。与其尝试将数据从一个处理实体传递到下一个处理实体,不如为每个数据实体创建一个辅助对象,然后在该辅助对象中执行该实体的所有计算。您是否可以对代码进行结构化,以便源代码可以生成一个负责实际生成和过滤图像的工作人员,然后让该工作人员在完成时通知目的地新数据已准备好呈现?您仍然需要将某种令牌从源序列化到工作者,并将最终数据从工作者序列化到目标,但您至少可以摆脱1或2次切换,并且可能能够找到一种更有效的方法来序列化剩下的内容,因为您只需序列化与目标相关的部分数据。

我已经尝试阅读了有关管理器的文档,但还没有真正管理ha!去发现他们的伟大。你是说队列和管道会对数据进行pickle处理,这意味着CPU周期,而使用自定义管理器,我可以通过更多的I/O,更少的CPU来发送原始数据?如果您想详细说明您的答案,那将非常有帮助。除了使用多处理的共享内存之外,所有数据传递机制都是通过使用pickle序列化和反序列化数据来操作的。管理器也做同样的事情,但不是来回传递对象的整个表示,而是将通过本地服务器提供服务的代理接口包装到对象上,然后让其他进程在该代理接口上运行,而不是传递整个对象。Source仍需输入整个图像,dest则需取出整个图像,但filter可能只需操作每个图像的一部分即可。不幸的是,我处理链的每一步都需要完整的数据。我确实用一些随机想法更新了我的问题,如果你也能看一下,我将不胜感激。