<p>我听到一些问题。我会一一回答</p>
<ul>
<li><strong>Dask能否跟踪输出子集所需的任务并仅计算这些任务?</strong></li>
</ul>
<p>是的。延迟Dask操作生成依赖关系图。在下列情况下磁盘阵列此图是按块显示的。如果您的输出只依赖于图的一个子集,那么Dask将删除不必要的任务。这方面的深入文档是<a href="http://dask.pydata.org/en/latest/optimize.html" rel="nofollow noreferrer">here</a>,特别是<a href="http://dask.pydata.org/en/latest/optimize.html#dask.optimize.cull" rel="nofollow noreferrer">cull</a>优化。在</p>
<p>以这个100000乘100000数组为例</p>
<pre><code>>>> x = da.random.random((100000, 100000), chunks=(1000, 1000))
</code></pre>
<p>假设我从中添加了几个1d切片</p>
^{pr2}$
<p>得到的优化图只足够计算输出</p>
<pre><code>>>> graph = y._optimize(y.dask, y._keys()) # you don't need to do this
>>> len(graph) # it happens automatically
301
</code></pre>
<p>我们可以很快计算出结果:</p>
<pre><code>In [8]: %time y.compute()
CPU times: user 3.18 s, sys: 120 ms, total: 3.3 s
Wall time: 936 ms
Out[8]:
array([ 1.59069994, 0.84731881, 1.86923216, ..., 0.45040813,
0.86290539, 0.91143427])
</code></pre>
<p>现在,这并不完美。它必须生产出我们两个切片接触到的所有1000x1000块。但你可以在那里控制粒度。在</p>
<p><strong>简短回答</strong>:Dask将自动检查图形,只运行评估输出所需的任务。你不需要做任何特别的事来做这件事。在</p>
<ul>
<li><strong>使用达斯克阵列?</strong></li>
</ul>
<p>也许吧。相关文档页在<a href="http://dask.pydata.org/en/latest/array-ghost.html" rel="nofollow noreferrer">Overlapping Blocks with Ghost Cells</a>上。磁盘阵列有方便的功能,便于写下来。但是它将创建内存中的副本。很多处在你这种地位的人觉得memcopy太慢了。Dask通常不支持就地计算,所以我们不能像正确的MPI代码那样高效。不过,我还是把性能问题留给你。在</p>