我已经生成了两个长度为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
我希望最终结果在一个系列中,以便可以将其与现有数据合并。
答案 0 :(得分:0)
我将在这里尝试扩大我的评论。拳头:给定的比numpy
的效果要好于pandas
(DataFrame
或Series
),最好使用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()