2017-08-02 48 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