1 回答

TA贡献1858条经验 获得超8个赞
为什么下面的 pickle 函数被调用两次?
通常,python 的 pickle 有效地将实例变量和对导入模块中的类的引用捆绑在一起。在 中__main__
,这可能不可靠,dask 回退到 cloudpickle(内部也调用 pickle)。在我看来,在第一次尝试腌制之前可能会进行"__main__"
检查。distributed.protocol.pickle.dumps
在每次迭代期间,每个进程都会收到 pickled 类的新副本
是的。每次 dask 运行任务时,它都会反序列化输入,创建实例的 nw 副本。请注意,您的 dask 工作线程可能是通过 fork_server 技术创建的,因此内存不是简单地复制(这是执行操作的安全方法)。
您可以在计算之前将实例“分散”给工作人员,他们可以重用其本地副本,但 dask 任务不应该通过改变对象来工作,而是通过返回结果(即功能上)来工作。
内存中有多少个 test_instance 副本
客户端中 1 个,加上每个正在执行的任务 1 个。序列化版本也可能存在,可能是保存在图中的版本,暂时保存在客户端,然后保存在调度程序上;在反序列化时它也会暂时存在于工作内存中。对于某些类型,零拷贝解/序列化是可能的。
如果由于对象的大小而导致任务非常大,那么您绝对应该事先“分散”它们(client.scatter
)。
有什么办法可以让这个值变成1吗?
您可以在进程中运行调度程序和/或工作线程来共享内存,但是,当然,您会失去与 GIL 的并行性。
添加回答
举报