如何将Python对象存储在内存中以供不同进程使用?

时间:2011-12-12 02:24:23

标签: python memory web

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

必须有一些东西将Python对象存储在内存中(而不是文件/字符串/序列化/ pickle),并且可以从任何进程访问它。我只是不知道它是什么。我已经遍布StackOverflow和Google,无法找到答案,所以我希望有人可以帮助我。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

  

必须有一些东西将Python对象存储在内存中(而不是作为   file / string / serialized / pickled)并且可以从任何人访问它   过程

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

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

答案 2 :(得分:1)

我会将其作为一个C模块实现,并导入每个Python脚本。然后,这个大对象的接口将用C或C和Python的某种组合实现。