2011-12-12 25 views
10

下面是情况:我有一个巨大的对象,需要加载到内存中。这么大,如果它被加载两次,它会超出我的机器上的可用内存(不,我不能升级内存)。我也不能把它分成任何小块。为了简单起见,我们只是说对象是600 MB,而我只有1 GB的RAM。我需要从一个Web应用程序中使用这个对象,该应用程序运行在多个进程中,并且我不控制它们是如何产生的(第三方负载平衡器是这样做的),所以我不能仅仅依靠创建对象在一些主线程/进程中,然后产生孩子。这也消除了使用像POSH这样的东西的可能性,因为它依赖于它自己的自定义分叉调用。我也不能使用像SQLite内存数据库,mmap或posix_ipc,sysv_ipc和shm模块之类的东西,因为这些模块充当内存中的文件,并且这些数据必须是我使用它的对象。使用其中的一种,我必须将它作为一个文件读取,然后在每个单独的进程和BAM中将其转换为对象,由于我只是尝试加载第二个副本,因此会超出机器的内存限制而导致分段错误。如何将Python对象存储在内存中供不同进程使用?

必须有一些方法可以将Python对象存储在内存中(而不是作为文件/字符串/序列化/腌制)并让它可以从任何进程访问。我只是不知道它是什么。我已经看遍了所有的StackOverflow和谷歌,找不到答案,所以我希望有人能帮助我。

+0

我不确定你的意思是“因为那些在内存中充当文件”。共享内存是一块内存,而不是一个文件。您可以使用该内存来存储任何内容,包括对象。这在Python中可能不是那么明显,但在C中是这样。这是否必须是一个纯Python解决方案,或者你会考虑一个混合的Python/C或Python/C++解决方案来通过C/C++绑定间接访问对象到共享内存中的对象吗? –

+0

因为这些东西在内存中充当文件,所以请参阅http://docs.python.org/library/mmap.html。 –

+1

像Python的Memcached可以提供帮助吗? – doremi

回答

4

http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes

查找共享存储器,或者服务器的过程。重新阅读你的文章后,服务器进程听起来更接近你想要的。

http://en.wikipedia.org/wiki/Shared_memory

+0

服务器进程部分的底部是: “服务器进程管理器比使用共享内存对象更灵活,因为它们可以支持任意对象类型,而且,单个管理器可以被不同计算机上的进程共享通过网络。“ 这是非常有趣的,可能正是我需要的,但我似乎无法找到如何做到这一点的好文档。搜索“python服务器进程”会产生模糊的结果。你知道任何好的资源吗? – Brendan

+0

为了回应我的最后一条评论,它实际上只是在同一页的不同部分:http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.BaseManager.connect 太棒了!这完全是为我工作。 – Brendan

1

我会实现这个作为被导入到每个Python脚本C模块中。然后,这个大对象的接口将用C语言或C和Python的组合来实现。

1

必须有某种方式在存储器中存储一个Python对象(而不是作为一个 文件/串/串行化/酸洗),并有它是来自任何 进程访问。

这不是工作方式。 Python对象引用计数和对象的内部指针在多个进程中没有意义。

如果数据不一定是实际的Python对象,您可以尝试处理存储在mmap()或数据库中的原始数据。

相关问题