如何在共享内存中轻松存储python可用的只读数据结构

2024-09-28 05:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python进程作为wsgiapache服务器。我在每台机器上都有这个过程的许多副本。我的进程中大约200兆字节是只读的python数据。我想把这些数据放在内存映射段中,这样进程就可以共享这些数据的一个副本。最好的方法是能够附加到这些数据上,这样它们就可以成为实际的Python2.7数据对象,而不是从pickle、DBM或SQLite之类的东西解析它们。在

是否有人拥有示例代码或指向已完成此操作的项目的指针来共享?在


Tags: 数据对象方法内存服务器机器示例sqlite
3条回答

一种可能是创建一个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)。我从来没有找到任何明确和简单的答案这个问题,但希望这能为你指出一些新的方向。告诉我们你最后会做什么!在

因为它是只读数据,所以你不需要在进程之间共享任何更新(因为不会有任何更新),我建议你在每个进程中保留一个本地副本。在

如果内存约束是一个问题,您可以看看使用没有锁的multiprocessing.Value或{}来实现这一点:https://docs.python.org/2/library/multiprocessing.html#shared-ctypes-objects

除此之外,如果我是你的话,我会看看Redis或Memcached。在

相关问题 更多 >

    热门问题