2017-08-02 49 views
0

這是一個後續問題,以回答我之前關於使用Dask計算到access one element in a large array的問題之一的可能答案。使用Dask計算會導致執行掛起

爲什麼使用Dask計算會導致執行掛起? 這裏的工作代碼片段:

#Suppose you created a scheduler at the ip address of 111.111.11.11:8786 


from dask.distributed import Client 
import dask.array as da 

# client1 
client1 = Client("111.111.11.11:8786") 
x = da.ones(10000000, chunks=(100000,)) # 1e7 size array cut into 1e5 size chunks 
x = x.persist() 
client1.publish_dataset(x=x) 

# client2 
client2 = Client("111.111.11.11:8786") 
x = client2.get_dataset('x') #get the lazy collection x 
result = x[0].compute() #code execution hangs here 
print(result) 

回答

1

persist行爲不同,這取決於你是否有一個分佈式客戶端激活。在你的情況下,你在做任何客戶之前調用它,結果是整個數據被打包到圖形描述中。線程調度器上的這種行爲是可行的,在該調度器中工作人員共享內存,但是當您發佈時,您將整個事件發送到調度程序,顯然這是窒息。

如果您先製作client1,您會注意到持續發生的速度非常快(在此情況下,調度程序僅獲取指向數據的指針),並且發佈 - 抓取週期將按預期工作。

+0

嗨MDurant,當我在定義client1之前堅持,滯後仍然發生。爲了保持一致性,我更新了上例中的代碼。 – sudouser2010

+0

滯後就好 - 當你堅持時你仍然在工人中創建數據 - 但現在它成功了嗎?您的代碼幾乎立即在我的筆記本電腦上運行。 – mdurant

+0

我能夠得到它的工作。我有兩個問題。首先,我不是使用111.111.11.11:8786,而是使用tcp://111.111.11.11:8786。其次,我沒有爲調度員創建任何工作人員。有趣的是,在使用persist後定義客戶端時,我能夠使代碼工作。 – sudouser2010