@modelnine在StackOverflow上的This post为这个问题提供了一个非常全面的答案。正如他所提到的,在web服务器中使用线程而不是进程分叉可以显著地教训这一点。几年前,我们使用某种类型的共享内存在clipython进程之间进行Iran into a similar problem trying to share extremely-large NumPy arrays,我们最终使用了一个sharedmemPython扩展的组合来在工作线程之间共享数据(这在某些情况下被证明会泄漏内存,但它可能是可以修复的)。只读的mmap()技术可能对您有用,但我不确定如何在纯python中实现这一点(NumPy解释了一个memmapping技术here)。我从来没有找到任何明确和简单的答案这个问题,但希望这能为你指出一些新的方向。告诉我们你最后会做什么!在
一种可能是创建一个C或C++扩展,它提供了一个Pythic接口到共享数据。您可以存储原始数据的200 MB内存,然后将C或C++扩展提供给WSGi服务。也就是说,可以用C实现常规(非共享)python对象,这些对象从共享内存中的某种二进制格式获取数据。我知道这并不是您想要的,但这样一来,数据至少在WSGI应用程序中看起来像Python一样。在
但是,如果数据由许多非常小的对象组成,那么即使是“入口点”也必须位于共享内存中(否则它们将浪费太多内存)。也就是说,您必须确保组成数据接口的PyObject*指针实际上指向共享内存。一、 e,python对象本身必须在共享内存中。据我所知的官方文件,这是不真正支持。但是,您可以尝试在共享内存中“手工制作”python对象,看看它是否有效。我猜在Python解释器试图释放内存之前,它是可以工作的。但在您的情况下,它不会,因为它是长期的和只读的。在
@modelnine在StackOverflow上的This post为这个问题提供了一个非常全面的答案。正如他所提到的,在web服务器中使用线程而不是进程分叉可以显著地教训这一点。几年前,我们使用某种类型的共享内存在clipython进程之间进行Iran into a similar problem trying to share extremely-large NumPy arrays,我们最终使用了一个sharedmemPython扩展的组合来在工作线程之间共享数据(这在某些情况下被证明会泄漏内存,但它可能是可以修复的)。只读的
mmap()
技术可能对您有用,但我不确定如何在纯python中实现这一点(NumPy解释了一个memmapping技术here)。我从来没有找到任何明确和简单的答案这个问题,但希望这能为你指出一些新的方向。告诉我们你最后会做什么!在因为它是只读数据,所以你不需要在进程之间共享任何更新(因为不会有任何更新),我建议你在每个进程中保留一个本地副本。在
如果内存约束是一个问题,您可以看看使用没有锁的}来实现这一点:https://docs.python.org/2/library/multiprocessing.html#shared-ctypes-objects
multiprocessing.Value
或{除此之外,如果我是你的话,我会看看Redis或Memcached。在
相关问题 更多 >
编程相关推荐