最后计算两个冻结的Dask数组

时间:2018-12-22 21:39:09

标签: dask dask-distributed

我已经生成了两个长度为450,000,000的随机dask数组,我想将它们彼此分开。当我去计算它们时,计算总是在最后冻结。

我有一个8核32GB实例正在运行以运行代码。

我尝试了以下代码,并且尝试了一些修改,但未将数据持久保存在x或y中。

x = da.random.random(450000000, chunks=(10000,))
x = client.persist(x)
z1 = dd.from_array(x)

y = da.random.random(450000000, chunks=(10000,))
y = client.persist(y)
z2 = dd.from_array(y)

flux_ratio_sq = z1.div(z2)
flux_ratio_sq.compute() 

我得到的实际结果是,持久性将x和y保留在内存中(总共8GB的内存),这是预期的,然后计算会增加更多的内存。我遇到的一些错误如下。

很多这些错误:

distributed.core - INFO - Event loop was unresponsive in Scheduler for 
3.74s.  This is often caused by long-running GIL-holding functions 
or moving large chunks of data. This can cause timeouts and instability.

tornado.application - ERROR - Exception in callback <bound method 
BokehTornado._keep_alive of <bokeh.server.tornado.BokehTornado 
object at 0x7fb48562a4a8>>

raise StreamClosedError(real_error=self.error)
tornado.iostream.StreamClosedError: Stream is closed

我希望最终结果在一个系列中,以便可以将其与现有数据合并。

1 个答案:

答案 0 :(得分:0)

我将在这里尝试扩大我的评论。拳头:给定的比numpy的效果要好于pandasDataFrameSeries),最好使用numpy进行计算,然后将结果附加到{{1} }(如果需要)。与DataFrame完全相同。在documentation之后的第二个步骤中,只有在需要多次调用同一数据框的情况下,才应坚持使用。

因此对于您的特定问题,您可以做的是

Dask

附录:使用import dask.array as da N = int(4.5e7) x = da.random.random(N, chunks=(10000,)) y = da.random.random(N, chunks=(10000,)) flux_ratio_sq = da.divide(x, y).compute() 而不是dask.dataframe可以使用to_parquet()并将结果存储到文件中。在这种令人尴尬的并行问题中,对RAM的影响小于使用compute()的影响。知道在compute()

的情况下是否可以应用类似的东西会很有趣