使用dask进行就地计算

时间:2017-07-27 15:37:01

标签: dask

短版

我有一个dask数组,其图形最终基于底部的一堆numpy数组,并将元素运算应用于它们。使用da.store计算数组并​​将结果存储回原始备份numpy数组是否安全,使整个事件成为就地操作?

如果您正在考虑“您正在使用dask错误”,请参阅下面的长版本,了解为什么我认为需要这样做。

长版

我正在将dask用于一个应用程序,其中原始数据来自内存中的numpy数组,其中包含从科学仪器收集的数据。目标是用原始数据填充大部分RAM(比如75%+),这意味着没有足够的内存副本。这使得它在语义上有点像一个核外问题,因为任何派生值只能在内存中以块的形式实现,而不是一次性实现。

除了一条皱纹外,Dask非常适合这种情况。我正在简化很多,但是对于大多数数据(称为X),我们需要应用元素操作f,计算一些汇总统计信息s(f(X)),并使用它来计算另一个对数据的结果,比如t(s(f(X)), f(X))。虽然所有函数都是对dask友好的(可以在每个块的基础上完成),但是尝试简单地运行这个dask图会导致f(X)一次全部保存在内存中,因为所有这些都是需要的。第二关。另一种方法是在询问s之前明确计算t(由https://github.com/dask/dask/issues/874建议),然后两次计算f(X),但这是一个有点昂贵的操作,所以我我想避免这种情况。

但是,一旦应用f,就不再需要原始数据。所以我想运行da.store(f(X))并将结果存储在原始的后备numpy数组中。从技术上讲,我认为我知道如何设置它,并且只要我可以确定每个数据在被覆盖之前被完全消耗,那么就没有竞争条件,但是我担心我可能会破坏API通过更改dask下面的数据来收缩,并且可能会以某种方式出错。有没有办法保证它是安全的?

我可以立即看到这个错误的一种方法是,如果几个输入数组具有相同的内容,因此在dask中得到相同的名称,导致它们在图中统一。我在name=False使用da.from_array,所以这不应该是一个问题。

0 个答案:

没有答案