यहाँ Jupyter नोटबुक का उपयोग करके तीन सबसे उत्कीर्ण उत्तरों की प्रदर्शन तुलना है। इनपुट में घनत्व 0.001 के साथ 1M x 100K यादृच्छिक विरल मैट्रिक्स है, जिसमें 100M गैर-शून्य मान हैं:
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.
(ध्यान दें कि प्रारूप को सीएसआर से सीओओ में बदल दिया गया है)।
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.
नोट : cPickle बहुत बड़ी वस्तुओं के साथ काम नहीं करता है ( यह उत्तर देखें )। मेरे अनुभव में, यह 270M गैर-शून्य मानों के साथ 2.7M x 50k मैट्रिक्स के लिए काम नहीं करता था।
np.savez
समाधान अच्छी तरह से काम किया।
निष्कर्ष
(CSR मैट्रिसेस के लिए इस सरल परीक्षण पर आधारित)
cPickle
सबसे तेज़ तरीका है, लेकिन यह बहुत बड़े मेट्रिसेस के साथ काम नहीं करता है, np.savez
केवल थोड़ा धीमा है, जबकि io.mmwrite
यह बहुत धीमा है, बड़ी फ़ाइल बनाता है और गलत प्रारूप को पुनर्स्थापित करता है। तो np.savez
यहाँ विजेता है।