【问题标题】:Sharing large object between different processes in Python 3.4在 Python 3.4 中的不同进程之间共享大对象
【发布时间】:2015-11-16 01:42:04
【问题描述】:

我试图在 Python 中的不同进程之间共享一个大对象(~2 GB),以减少内存使用。我已经了解了多处理库 (https://docs.python.org/3.4/library/multiprocessing.html#multiprocessing-managers) 中的 Manager 类和代理。但是,根据文档和其他 Stackoverflow 用户的说法,当它用于像这样的大型对象时,这可能会非常慢。这是正确的,如果是这样,是否有另一个更快的 Python 库或函数可以代替我使用?谢谢。

编辑:我创建的对象是一个 DAG(有向无环图),其构造函数由标准 python 值组成。

【问题讨论】:

  • 你所说的“共享”是什么意思——读取还是变异?
  • 我的意思是阅读。我不会以任何方式更改对象。
  • 你看过mmap吗?
  • 我有,但没听说过太多。它比代理对象快吗?
  • 取决于你在做什么,mmap 可以非常快。如果您要共享复杂的对象树,可能不会那么多,但如果您要共享能够很好地映射到文件的东西,那么它只是保留在内存中的数据。

标签: python performance python-3.4 python-multiprocessing


【解决方案1】:

该问题的一个解决方案是使 图形成为一个进程,它公开使用代理从其他进程执行的方法。这意味着您必须构建与manager.dictmanager.value 类似的类。 这是通过生产者/消费者模式完成的。它称为进程间调用 (IPC) 或远程过程调用 (RPC)。解决方案可能涉及zerolesspyro

另一种解决方案,更简单

另一个解决方案是使用数据库。例如,bsddblmdb 至少支持对数据库的多进程读取访问。使用ajguthe simpler design。可以让你免于编写大量代码。

最后的解决方案是在内存中构建一个 mmap 文件并从中读取。但这确实是一个解决方案,您的图形是只读的,因为如果您希望修改图形,您将需要开始编写一个 mmap 的图形数据库。这具有完全在内存中的优势。

我的建议是使用 lmdb 构建一个图形数据库,以 ajgu 的简单版本为例,其中包含两个脚本:

  • 一个创建数据库
  • 另一个类将使用来自不同进程的图表。

【讨论】:

    【解决方案2】:

    如果您的数据仅限于标准值和数组(没有其他 Python 对象),您可以使用共享内存(Value() 和 Array(),请参阅 https://docs.python.org/3.4/library/multiprocessing.html#shared-ctypes-objects)。速度非常快。

    【讨论】:

    • 抱歉没有澄清,但它是一个用户定义的对象,它的构造函数由标准的python值组成。这种情况下还能用吗?
    • 看起来不行,因为我的用户定义对象肯定不是 ctype ojbect。
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2023-03-24
    • 2012-07-22
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多