在Python 3.4中的不同进程之间共享大对象

时间:2015-08-22 02:36:45

标签: python performance python-3.4 python-multiprocessing

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

另一种解决方案,更简单

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

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

我的建议是使用lmdb构建一个图形数据库,从简单版本的ajgu中获取两个脚本:

  • 一个用于创建数据库
  • 另一个将使用不同过程中的图表的类。