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 的并行性。
添加回答
舉報