多处理中的共享内存对象
在多处理架构中使用大型内存数组时,通常会面临内存消耗的问题。将这些数组复制到多个进程中的效率可能非常低。
只读共享数组
对于只读内存数组,例如 NumPy 数组,复制Unix 等操作系统中存在的 -on-write fork() 语义提供了一个解决方案。如果数组在其整个生命周期内保持不变,则可以在子进程之间共享它,而无需额外的内存分配。无需在代码中进行任何特定修改即可实现此目的。
大型数组的有效方法
对于大型数组,一种有效的方法是将它们打包到结构化数组中(例如NumPy数组),将它们存储在共享内存中,用multiprocessing.Array包装它们,并将它们传递给所需的函数。这种方法最大限度地减少了内存开销。
可写共享对象
在可写共享对象必不可少的情况下,同步或锁定机制就变得必要。多处理提供两个选项:共享内存(适用于简单值、数组或 ctypes)或 Manager 代理。 Manager 代理授予一个进程对内存的所有权,而其他进程则通过仲裁来访问它。
共享内存注意事项
Manager 代理方法可容纳任意 Python 对象,但可能会遇到由于序列化和反序列化开销而导致性能下降。重要的是要承认,即使使用写时复制 fork(),仍然可能存在一些与共享内存操作相关的开销。
替代库
超越多处理Python 中提供了大量并行处理库和方法。如果您的需求超出了多处理的能力,那么探索替代库可能会有所帮助。
以上是如何在多处理中有效共享大型内存数组?的详细内容。更多信息请关注PHP中文网其他相关文章!