2017-09-04 6 views
1

Ich habe eine Sparse Matrix csr:Sparse Matrix Slicing Speicherfehler

<681881x58216 sparse matrix of type '<class 'numpy.int64'>' 
    with 2867209 stored elements in Compressed Sparse Row format> 

und ich möchte eine neue sparce Matrix als eine Scheibe csr erstellen: csr_2 = csr[1::2,:].

Problem: Wenn ich nur csr Matrix habe, ist der RAM meines Servers mit 40 GB beschäftigt. Wenn ich die csr_2 = csr[1::2,:] starte, wird der RAM meines Servers komplett für 128GB gespeichert und es fällt mit "Speicherfehler".

+0

Ihre Matrix selbst nur 22MB (Werte) + einig aux-Material ist, wahrscheinlich <80 MB Speicher. Also bist du sicher, das ist die Quelle deines Problems (etwas anderes auf deinem Server benutzt wahrscheinlich 39 GB Speicher)? (und das Schneiden spärlicher Matrizen wird übrigens eine Kopie erzeugen) – sascha

+0

(1) Diese Scheibe nimmt jedes Element nach dem anderen, beginnend mit dem zweiten Element (ungerade Elemente). (2) Server hat viele docker fcontainer und andere wartende Prozesse, die alle zusammen 40 GB dauern –

Antwort

0

sparse verwendet Matrixmultiplikation, um Zeilen wie diese auszuwählen. Ich habe die Details der extractor-Matrix in einer anderen SO-Frage ausgearbeitet, aber grob um eine (p, n) -Matrix von einer (m, n) -Matrix zu erhalten, muss sie eine (p, m) -Matrix verwenden (mit Nicht-Null-Werten)).

Die Matrixmultiplikation selbst ist ein 2-Pass-Prozess. Der erste Durchgang bestimmt die Größe der resultierenden Matrix.

Im Gegensatz zu dichten numpy-Arrays gibt das Sharse-Matrix-Slicing niemals eine Ansicht zurück.

Sparse matrix slicing using list of int

hat Details über die Extraktionsmatrix. Ich schlage auch vor, csr.sum(axis=1) zu testen, da auch das Matrixmultiplikation verwendet.


def extractor(indices, N): 
    indptr=np.arange(len(indices)+1) 
    data=np.ones(len(indices)) 
    shape=(len(indices),N) 
    return sparse.csr_matrix((data,indices,indptr), shape=shape) 

So erfordert jede zweite Zeile der Indizierung:

in Ihrem Beispiel
In [99]: M = sparse.random(100,80,.1, 'csr') 
In [100]: M 
Out[100]: 
<100x80 sparse matrix of type '<class 'numpy.float64'>' 
    with 800 stored elements in Compressed Sparse Row format> 
In [101]: E = extractor(np.r_[1:100:2],100) 
In [102]: E 
Out[102]: 
<50x100 sparse matrix of type '<class 'numpy.float64'>' 
    with 50 stored elements in Compressed Sparse Row format> 
In [103]: M1 = E*M 
In [104]: M1 
Out[104]: 
<50x80 sparse matrix of type '<class 'numpy.float64'>' 
    with 407 stored elements in Compressed Sparse Row format> 
+0

Danke, ich werde Ihre Antwort später studieren! –

+0

Also, die Lösung, die Sie vorschlagen, ist die Extractor-Funktion zu verwenden? –

+0

Nein, ich schlage nur einen Grund vor, warum Sie den Speicherfehler bekommen könnten. Aber ohne deine Daten, RAM usw. kann ich es nicht beweisen. – hpaulj