如何在 Python 多重处理中高效共享大型只读数据?

Linda Hamilton
发布: 2024-10-24 18:45:50
原创
714 人浏览过

How to Share Large Readonly Data Efficiently in Python Multiprocessing?

在多处理中维护共享只读数据

问题:

在 Python 多处理环境中,如何确保在不创建副本的情况下在多个进程之间共享相当大的只读数组(例如 3 Gb)?

答案:

利用由多处理模块与 NumPy 结合使用,可以在进程之间高效共享数据。

<code class="python">import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)</code>
登录后复制

这种方法利用了 Linux 对 fork() 采用写时复制语义的事实,确保仅在以下情况下才复制数据:修改的。因此,即使没有显式使用 multiprocessing.Array,数据也会在进程之间有效共享,除非发生更改。

<code class="python"># Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i,:] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print(shared_array)</code>
登录后复制

此代码同时修改共享数组并演示了在多个进程之间成功共享数据:

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [ 2.  2.  2.  2.  2.  2.  2.  2.  2.  2.]
 [ 3.  3.  3.  3.  3.  3.  3.  3.  3.  3.]
 [ 4.  4.  4.  4.  4.  4.  4.  4.  4.  4.]
 [ 5.  5.  5.  5.  5.  5.  5.  5.  5.  5.]
 [ 6.  6.  6.  6.  6.  6.  6.  6.  6.  6.]
 [ 7.  7.  7.  7.  7.  7.  7.  7.  7.  7.]
 [ 8.  8.  8.  8.  8.  8.  8.  8.  8.  8.]
 [ 9.  9.  9.  9.  9.  9.  9.  9.  9.  9.]]
登录后复制

通过利用共享内存和写时复制语义,此方法提供了一种有效的解决方案,用于在多处理环境中的进程之间共享大量只读数据。

以上是如何在 Python 多重处理中高效共享大型只读数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!