2015-09-23 5 views
3

Я хочу поэтапно построить чрезвычайно большую разреженную матрицу. Проблема в том, что lil_matrix занимает так много ОЗУ, что становится неэффективным. Например, если я хочу создать 20 миллионов x 20 миллионов lil_matrix, он полностью ударит мою RAM. С другой стороны, csr_matrix едва занимает пространство. Однако csr_matrix якобы неэффективен для модификаций. Есть ли другой способ получить преимущество lil_matrix, не занимая столько места в ОЗУ? Кроме того, почему он занимает столько места, в первую очередь, поскольку он должен быть разреженной матрицей?Python: lil_matrix vs csr_matrix в чрезвычайно больших разреженных матрицах

Примечание: Реальная проблема на самом деле не создает такую ​​большую матрицу, но вместо того, чтобы создавать следующие list:

list = [sp.lil_matrix((150,150)) for i in range(1000)] 

который также взрывает мой RAM.

+0

Из эксперимента, кажется, что lil_matrix() угадывает структуру разреженности, которая довольно щедрая. Таким образом, каждая построенная матрица занимает больше памяти, чем вы/возможно. csr_matrix медленнее для индексированного присвоения, но более консервативен при первоначальном распределении. В зависимости от ваших данных, вы можете добавить dtype = int в конструктор lil_matrix(). – gerowam

ответ

2

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

In [12]: s = sparse.csr_matrix((5,5)) 

In [13]: s.__dict__ 
Out[13]: 
{'_shape': (5, 5), 
'data': array([], dtype=float64), 
'format': 'csr', 
'indices': array([], dtype=int32), 
'indptr': array([0, 0, 0, 0, 0, 0], dtype=int32), 
'maxprint': 50} 

In [14]: s.indptr.nbytes 
Out[14]: 24 

In [15]: l = sparse.lil_matrix((5,5)) 

In [16]: l.__dict__ 
Out[16]: 
{'_shape': (5, 5), 
'data': array([[], [], [], [], []], dtype=object), 
'dtype': dtype('float64'), 
'format': 'lil', 
'maxprint': 50, 
'rows': array([[], [], [], [], []], dtype=object)} 

In [17]: l.data.nbytes 
Out[17]: 40 

In [18]: l.rows.nbytes 
Out[18]: 40 
+0

Это было полезно. Таким образом, в принципе, 'lil_matrix' не разрешен вообще, поскольку он инициализирует такое же пространство, что и обычная матрица. Какой смысл использовать его в первую очередь? – Michael

+0

@Michael, 'lil_matrix', безусловно, разрежен, он просто хранит информацию иначе, чем' csr_matrix'. Обычная 5 на 5 плотная матрица, содержащая 'np.float', займет 200 байт. Вы можете прочитать о преимуществах и недостатках 'lil_matrix' здесь: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.lil_matrix.html – Akavall

Смежные вопросы