如何在内存中存储Python对象以供不同进程使用?
情况是这样的:我有一个非常大的对象需要加载到内存中。大到如果加载两次,就会超过我电脑的可用内存(而且,我不能升级内存)。我也不能把它分成更小的部分。为了简单起见,假设这个对象有600 MB,而我只有1 GB的内存。我需要在一个网页应用中使用这个对象,这个应用运行在多个进程中,而我无法控制这些进程是怎么启动的(是一个第三方的负载均衡器在处理),所以我不能只在某个主线程或主进程中创建这个对象,然后再派生出子进程。这也排除了使用像POSH这样的方案,因为它依赖于自己的自定义分叉调用。我也不能使用像SQLite内存数据库、mmap或posix_ipc、sysv_ipc和shm模块,因为那些都是把数据当作文件在内存中处理,而我需要的是一个对象来使用。如果使用其中一个,我就得把它当作文件读取,然后在每个进程中把它转成对象,结果就是,内存超限导致的段错误,因为我试图加载第二份副本。
一定有办法把Python对象存储在内存中(而不是作为文件、字符串、序列化或腌制的形式),并且能让任何进程都能访问。我就是不知道该怎么做。我在StackOverflow和Google上查了很多,找不到答案,所以希望有人能帮我。
3 个回答
我会把这个做成一个C语言模块,然后在每个Python脚本中导入它。这样,和这个大对象的交互接口就可以用C语言来实现,或者用C和Python的结合来实现。
一定有办法把一个Python对象存储在内存中(而不是以文件、字符串、序列化或腌制的形式),并且可以被任何进程访问。
但实际上并不是这样。Python的对象引用计数和对象内部指针在多个进程之间是无法理解的。
如果数据不一定要是一个真正的Python对象,你可以尝试直接操作存储在mmap()中的原始数据,或者使用数据库之类的东西。
可以查看共享内存或者服务器进程。重新读了一遍你的帖子,感觉服务器进程更接近你想要的东西。
你可以参考这个链接了解共享内存的相关内容:http://en.wikipedia.org/wiki/Shared_memory