Hier ist ein Leistungsvergleich der drei am besten bewerteten Antworten mit dem Jupyter-Notizbuch. Die Eingabe ist eine 1M x 100K zufällige Matrix mit geringer Dichte und einer Dichte von 0,001, die 100M Werte ungleich Null enthält:
from scipy.sparse import random
matrix = random(1000000, 100000, density=0.001, format='csr')
matrix
<1000000x100000 sparse matrix of type '<type 'numpy.float64'>'
with 100000000 stored elements in Compressed Sparse Row format>
io.mmwrite
/. io.mmread
from scipy.sparse import io
%time io.mmwrite('test_io.mtx', matrix)
CPU times: user 4min 37s, sys: 2.37 s, total: 4min 39s
Wall time: 4min 39s
%time matrix = io.mmread('test_io.mtx')
CPU times: user 2min 41s, sys: 1.63 s, total: 2min 43s
Wall time: 2min 43s
matrix
<1000000x100000 sparse matrix of type '<type 'numpy.float64'>'
with 100000000 stored elements in COOrdinate format>
Filesize: 3.0G.
(Beachten Sie, dass das Format von csr auf coo geändert wurde).
np.savez
/. np.load
import numpy as np
from scipy.sparse import csr_matrix
def save_sparse_csr(filename, array):
np.savez(filename, data=array.data, indices=array.indices,
indptr=array.indptr, shape=array.shape)
def load_sparse_csr(filename):
loader = np.load(filename + '.npz')
return csr_matrix((loader['data'], loader['indices'], loader['indptr']),
shape=loader['shape'])
%time save_sparse_csr('test_savez', matrix)
CPU times: user 1.26 s, sys: 1.48 s, total: 2.74 s
Wall time: 2.74 s
%time matrix = load_sparse_csr('test_savez')
CPU times: user 1.18 s, sys: 548 ms, total: 1.73 s
Wall time: 1.73 s
matrix
<1000000x100000 sparse matrix of type '<type 'numpy.float64'>'
with 100000000 stored elements in Compressed Sparse Row format>
Filesize: 1.1G.
cPickle
import cPickle as pickle
def save_pickle(matrix, filename):
with open(filename, 'wb') as outfile:
pickle.dump(matrix, outfile, pickle.HIGHEST_PROTOCOL)
def load_pickle(filename):
with open(filename, 'rb') as infile:
matrix = pickle.load(infile)
return matrix
%time save_pickle(matrix, 'test_pickle.mtx')
CPU times: user 260 ms, sys: 888 ms, total: 1.15 s
Wall time: 1.15 s
%time matrix = load_pickle('test_pickle.mtx')
CPU times: user 376 ms, sys: 988 ms, total: 1.36 s
Wall time: 1.37 s
matrix
<1000000x100000 sparse matrix of type '<type 'numpy.float64'>'
with 100000000 stored elements in Compressed Sparse Row format>
Filesize: 1.1G.
Hinweis : cPickle funktioniert nicht mit sehr großen Objekten (siehe diese Antwort ). Nach meiner Erfahrung hat es bei einer 2,7 M x 50 k-Matrix mit 270 M Nicht-Null-Werten nicht funktioniert.
np.savez
Lösung funktionierte gut.
Fazit
(basierend auf diesem einfachen Test für CSR-Matrizen)
cPickle
ist die schnellste Methode, funktioniert jedoch nicht mit sehr großen Matrizen, np.savez
ist nur geringfügig langsamer, io.mmwrite
viel langsamer, erzeugt größere Dateien und stellt das falsche Format wieder her. So np.savez
ist der Gewinner hier.