如何在python的多处理中跨进程共享大型只读字典/列表?

Vin*_*ana 1 python multithreading multiprocessing

我有一个 18Gb 的 pickle 文件,我需要跨进程访问它。我尝试使用

from multiprocessing import Manager
import cPickle as pkl
manager = Manager()
data = manager.dict(pkl.load(open("xyz.pkl","rb")))
Run Code Online (Sandbox Code Playgroud)

但是,我遇到以下问题:

IOError: [Errno 11] Resource temporarily unavailable 
Run Code Online (Sandbox Code Playgroud)

有人建议这可能是因为套接字超时,但它似乎不是因为增加超时没有帮助。我该怎么做。还有其他有效的跨进程共享数据的方法吗?

tor*_*rek 5

这主要是multiprocessingShared memory的副本,但您专门查看 a dictorlist对象,而不是简单的数组或值。

不幸的是,没有像这样共享字典或列表的简单方法,因为字典的内部结构很复杂(并且在不同的 Python 版本之间有所不同)。如果你可以重构你的问题以便你可以使用一个Array对象,你可以创建一个sharedArray,填充它一次,然后不加锁地使用它。这将是很大一般更有效。

根据访问模式,也可以简单地先加载对象,然后创建进程池,这也可以在带有 copy-on-write 的类 Unix 系统上运行良好fork。但这里没有任何保证。

请注意,当您EAGAIN尝试通过Manager实例发送大量值时,会出现错误编号 11 == “资源暂时不可用” 。管理器根本不共享底层数据:相反,他们代理访问,以便每个独立进程都有自己的副本,当一个进程更新一个值时,它会将更新发送给参与共享错觉的每个人。通过这种方式,每个人都可以(最终,取决于访问时间)就这些值达成一致,因此它们似乎都在使用相同的值。但实际上,每个人都有一份私人副本。