Dask хранит / читает разреженную матрицу, которая не помещается в памяти - PullRequest
0 голосов
/ 20 февраля 2019

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

Вот упрощенная версия того, что я пытаюсь сделать:

file_path = './{}'.format('myfile.npz')
if os.path.isfile(file_path):
  # Load file with sparse matrix
  X_sparse = sparse.load_npz(file_path)
else:
  # All matrix elements are initially equal to 0
  coords, data = [], []
  X_sparse = sparse.COO(coords, data, shape=(88506, 1440000))
  # Create file for later retrieval
  sparse.save_npz(file_path, X_sparse)

# Create Dask array from matrix to allow usage of blocked algorithms
X = da.from_array(X_sparse, chunks='auto').map_blocks(sparse.COO)
return X

К сожалениюкод выше выдает следующую ошибку при попытке использовать compute() с X: Cannot convert a sparse array to dense automatically. To manually densify, use the todense method.;но я не могу преобразовать разреженную матрицу в плотную память, так как это приведет к ошибке.

Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 06 июня 2019

Вы можете взглянуть на следующую проблему: https://github.com/dask/dask/issues/4523

В принципе, sparse намеренно предотвращает автоматическое преобразование в плотную матрицу.Однако, установив переменную среды SPARSE_AUTO_DENSIFY=1, вы можете переопределить это поведение.Тем не менее, это только решает ошибку, но не достигает вашей главной цели.

Что вам нужно сделать, это разбить ваш файл на несколько * .npz разреженных матриц, загрузить их с sparse с задержкой(см. dask.delayed) и объедините их в один большой разреженный массив Dask.

Мне придется реализовать нечто подобное в ближайшем будущем.ИМХО, это должно быть поддержано Dask более родным ...

...