Чтобы, например, применить БИХ-фильтр, закодированный в Numpy / Numba вдоль всей оси, мне нужно повторно разделить массив size=(M, N)
dask с chunks=(m0, n0)
до chunks=(m1, N)
с m1 < m0
.
Поскольку Dask избегает повторяющихся задач, во время rechunk-split / rechunk-merge в памяти будут храниться данные стоимостью (m0, N)
(x 2?). Есть ли способ оптимизировать график, чтобы избежать такого поведения?
Я знаю, где можно найти информацию об оптимизации графиков Даска вручную. Но есть ли способ либо изменить политику планирования, чтобы позволить повторять задачи, либо (автоматически) перестроить график, чтобы минимизировать использование памяти во время этого повторного блока?
Вот минимальный пример (для крайнего случая, когда chunks=(M, 1)
→ chunks=(1, N)
):
from dask import array as da
from dask.distributed import Client
# limit memory to 4 GB
client = Client(memory_limit=4e9)
# Create 80 GB random array with chunks=(M, 1)
arr = da.random.uniform(-1, 1, size=(1e5, 1e5), chunks=(1e5, 1))
# Compute mean (This works!)
arr.mean().compute()
# Rechunk to chunks=(1, N)
arr = arr.rechunk((1, 1e5))
# Compute mean (This hits memory limit!)
arr.mean().compute()