Сохранение большого scipy.sparse.csr_matrix - PullRequest
0 голосов
/ 24 мая 2018

У меня очень большая скудная матрица.Попытка использовать save_npz привела к следующей ошибке:

>>> sp.save_npz('/projects/BIGmatrix.npz',W)
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 716, in _savez
    pickle_kwargs=pickle_kwargs)
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/format.py", line 597, in write_array
    array.tofile(fp)
OSError: 6257005295 requested and 3283815408 written

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/scipy/sparse/_matrix_io.py", line 78, in save_npz
    np.savez_compressed(file, **arrays_dict)
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 659, in savez_compressed
    _savez(file, args, kwds, True)
  File "/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py", line 721, in _savez
    raise IOError("Failed to write to %s: %s" % (tmpfile, exc))
OSError: Failed to write to /projects/BIGmatrix.npzg6ub_z3y-numpy.npy: 6257005295 requested and 3283815408 written

Поэтому я хотел попытаться сохранить ее в postgres через psycopg2, но я не нашел способ итерации по всем ненулевым, поэтому яможно сохранить их как строки в таблице.

Как лучше всего справиться с этой задачей?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Сохраните все атрибуты в __dict__ объекта матрицы и воссоздайте csr_matrix при загрузке:

from scipy import sparse
import numpy as np

a = np.zeros((1000, 2000))
a[np.random.randint(0, 1000, 100), np.random.randint(0, 2000, 100)] = np.random.randn(100)

b = sparse.csr_matrix(a)

np.savez("tmp", data=b.data, indices=b.indices, indptr=b.indptr, shape=np.array(b.shape))
f = np.load("tmp.npz")
b2 = sparse.csr_matrix((f["data"], f["indices"], f["indptr"]), shape=f["shape"])
(b != b2).sum()
0 голосов
/ 25 мая 2018

Кажется, что дела идут так:

Когда вы вызываете scipy.sparse.save_npz(), по умолчанию он сохраняется как сжатый файл;однако для этого сначала создается временная несжатая версия целевого файла, которая затем сжимается до конечного результата.Это означает, что любой диск, на котором вы сохраняете, должен быть достаточно большим, чтобы вместить несжатый временный файл, который в моем случае был 47G.

Я повторил попытку сохранения на большом диске, и процесс завершился без происшествий.

Примечание. Сжатие может занять довольно много времени.

...