1 回答

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊
為什么下面的 pickle 函數(shù)被調(diào)用兩次?
通常,python 的 pickle 有效地將實(shí)例變量和對(duì)導(dǎo)入模塊中的類的引用捆綁在一起。在 中__main__
,這可能不可靠,dask 回退到 cloudpickle(內(nèi)部也調(diào)用 pickle)。在我看來(lái),在第一次嘗試腌制之前可能會(huì)進(jìn)行"__main__"
檢查。distributed.protocol.pickle.dumps
在每次迭代期間,每個(gè)進(jìn)程都會(huì)收到 pickled 類的新副本
是的。每次 dask 運(yùn)行任務(wù)時(shí),它都會(huì)反序列化輸入,創(chuàng)建實(shí)例的 nw 副本。請(qǐng)注意,您的 dask 工作線程可能是通過(guò) fork_server 技術(shù)創(chuàng)建的,因此內(nèi)存不是簡(jiǎn)單地復(fù)制(這是執(zhí)行操作的安全方法)。
您可以在計(jì)算之前將實(shí)例“分散”給工作人員,他們可以重用其本地副本,但 dask 任務(wù)不應(yīng)該通過(guò)改變對(duì)象來(lái)工作,而是通過(guò)返回結(jié)果(即功能上)來(lái)工作。
內(nèi)存中有多少個(gè) test_instance 副本
客戶端中 1 個(gè),加上每個(gè)正在執(zhí)行的任務(wù) 1 個(gè)。序列化版本也可能存在,可能是保存在圖中的版本,暫時(shí)保存在客戶端,然后保存在調(diào)度程序上;在反序列化時(shí)它也會(huì)暫時(shí)存在于工作內(nèi)存中。對(duì)于某些類型,零拷貝解/序列化是可能的。
如果由于對(duì)象的大小而導(dǎo)致任務(wù)非常大,那么您絕對(duì)應(yīng)該事先“分散”它們(client.scatter
)。
有什么辦法可以讓這個(gè)值變成1嗎?
您可以在進(jìn)程中運(yùn)行調(diào)度程序和/或工作線程來(lái)共享內(nèi)存,但是,當(dāng)然,您會(huì)失去與 GIL 的并行性。
添加回答
舉報(bào)