2015-08-22 39 views
5

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

编辑:我创建的对象是一个DAG(有向非循环图),其构造由标准蟒值,虽然。

+1

你说的“共享”的意思是 - 读或变异? – FMc

+0

我的意思是读。我不以任何方式改变对象。 –

+0

你看过mmap吗? –

回答

1

如果您的数据被限制在标准值和阵列(没有任何其他Python对象),可以使用共享存储器(值()和阵列(),见https://docs.python.org/3.4/library/multiprocessing.html#shared-ctypes-objects)。它非常快。

+0

对不起,不明确,但它是一个用户定义的对象,其构造函数虽然由标准的python值组成。它会在这种情况下仍然有效吗? –

+0

它看起来不像它的作品,因为我的用户定义的对象当然不是ctype ojbect。 –

1

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

另一种解决方案,那就是简单

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

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

我的建议是使用lmdb建立以为例,从ajgu的简化版本图形数据库有两个脚本:

  • 来创建数据库
  • 将使用该图从不同的另一类处理。
+0

如果你想讨论关于它在[new new forge](https://github.com/amirouche/AjguDB)上跳转的问题,我是AjguDB的主角。 – amirouche