我有一个18Gb的pickle文件,我需要跨进程访问。我尝试使用
from multiprocessing import Manager
import cPickle as pkl
manager = Manager()
data = manager.dict(pkl.load(open("xyz.pkl","rb")))
但是,我收到以下问题:
IOError: [Errno 11] Resource temporarily unavailable
有人建议这可能是因为套接字超时但似乎不是因为增加超时没有帮助。 我该如何解决这个问题。有没有其他有效的方法跨进程共享数据?
答案 0 :(得分:2)
这大部分都是Shared memory in multiprocessing的副本,但您专门查看dict
或list
对象,而不是简单的数组或值。
不幸的是,没有简单的方法可以共享这样的字典或列表,因为字典的内部很复杂(并且在不同的Python版本中有所不同)。如果您可以重构问题以便可以使用Array
对象,则可以创建shared Array
,填写一次,然后无锁地使用它。这通常会更加高效
根据访问模式,只需首先加载对象,然后创建进程池,也可以在类似Unix的系统上使用copy-on-write fork
。但这里没有任何保证。
请注意,您尝试通过EAGAIN
实例发送大量值时,会出现错误,错误编号11 = Manager
="资源暂时不可用" 。管理员根本不会共享基础数据:相反,他们代理访问,这样每个独立进程都有自己的副本,当一个进程更新一个值时,它将更新发送给参与幻觉共享的每个人。通过这种方式,每个人都可以(最终,取决于访问时间)同意这些值是什么,以便他们所有看起来使用相同的值。但实际上,每个人都有私人副本。