Сжатый в памяти массив Persist Dask

120
9

Предположим, что у меня есть класс, который хранит массив numpy сжатым способом, но также поддерживает индексирование:

class Compressed:
def __init__(self, numpy_array):
"... store numpy_array in a compressed way ..."
def __getitem__(self, index):
return "... the equivalent of numpy_array[index] ..."

Есть ли разумный (не хаккий) способ заставить это работать с настойчивостью? Я хотел бы иметь возможность определить большой (но сжимаемый) массив x, а затем получить эквивалент x.persist(), но где данные в памяти все обернуты внутри сжатых экземпляров. Бонус, если он может работать с dask.persist().

спросил(а) 2021-01-19T15:46:01+03:00 9 месяцев назад
1
Решение
66

Да, вы можете сопоставить свой класс " Compressed " на блоках вашего dask.array, сохраняйте это, а затем выполните вызов np.asarray. Ваши данные будут сохраняться в сжатой форме. Это немного незаконно, потому что большинство операций с numpy не будут работать над этими блоками. Однако, если вы будете следить за ленивыми вызовами np.asarray тогда все должно быть в безопасности.

пример

В приведенном ниже примере мы делаем это с классом bcolz.carray, который реализует сжатый массив.

import bcolz
import dask.array as da
import numpy as np

x = da.random.randint(0, 100, size=(1000, 1000, 1000), chunks=(100, 100, 100))

x = x.map_blocks(bcolz.carray).persist().map_blocks(np.asarray) # <<--- main point

import psutil;

>>> psutil.Process().memory_info().rss / x.nbytes # compression ratio
0.173897216

>>> x.sum().compute() # things still work
49499671807

нарезка

Однако это вызывает np.asarray на каждом блоке до доступа, что может быть не очень эффективным, если ваша схема сжатия поддерживает произвольный доступ. Если это важно для вас, дайте мне знать, и я посмотрю, смогу ли найти обходной путь.

Dask хранит данные, сжатые на диске

Кроме того, стоит отметить, что если вы используете распределенный планировщик и если у вас есть локальный диск для каждого узла, тогда Dask будет выгружать лишние данные на диск в сжатом формате. Это, очевидно, медленнее, чем чтение из сжатых данных в памяти, но все же может быть полезно.

ответил(а) 2021-01-19T15:46:01+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема