我有一个python模块dataProcessor.py
,它将大量数据初始化到内存中(大约3GB),我想在同时运行的不同进程中使用这个模块。
但问题是,由于dataProcessor.py
将数据加载到每个进程的内存中(每个进程的内存为3GB,因此3个进程的内存总数为9GB ),机器上没有足够的内存同时运行所有的东西。
我尝试使用服务器-客户端模型来初始化数据一次,并为所有进程服务,但是这个模型太慢了。是否有任何方法只加载一次数据并让其他进程访问模块dataProcessor.py
中的方法?
我正在讨论的模块是空间性,它是用Cython编写的。数据可以是任何Python对象,并且一旦写入就不会改变。如果解决方案是Python的C扩展,就可以了。
除了共享内存的服务器-客户端或子进程模型之外,还有其他选择吗?
发布于 2017-09-01 04:00:35
首先,如果可以的话,将数据初始化放到一个函数中(因此在导入时不会进行初始化)。这有助于测试等。
您可以使用multiprocessing.sharedctypes
创建跨多个进程共享的变量,前提是您要分叉到多个进程(而不是创建多个线程)。然后,您可以将这些共享变量传递给分叉进程。
示例:
from ctypes import c_double
from multiprocessing.sharedctypes import Array, Pool
arr = Array(c_double, 402653184) # 3 GB array
arr[0] = 1.0
arr[1] = 2.0
...
def fn(in_arr, j):
print(in_arr[j])
with Pool() as p:
p.apply_async(fn, (arr, 0))
p.apply_async(fn, (arr, 1))
p.apply_async(fn, (arr, 2))
p.join()
发布于 2017-01-23 11:34:52
将模块隐藏在API后面,并作为服务器运行它。实例化实现此API的服务器一次,并使与此模块的所有通信通过API和服务器。您可以使用IPC或直接使用rest,这并不重要。
尽管如此,这并不是解决问题的快速和容易的办法,但它应该做好这项工作。
https://softwareengineering.stackexchange.com/questions/340682
复制相似问题