2016-06-19 26 views
0

Derzeit implementiere ich diese paper für meine Bachelor-Thesen mit Python, aber ich benutze nur die Mahalanobis Metrik lernen (falls Sie neugierig sind).Speicherauspuff auf große Matrixoperation mit dask

In einer Verknüpfung, ich habe ein Problem, wenn ich eine Matrix mit der Größe von 67K * 67K, bestehend aus Ganzzahl, durch einfach numpy.dot(A.T,A) wo A ist ein zufälliger Vektor Größe (1,67K) lernen muss. Wenn ich das mache, wirf einfach MemoryError, da mein PC nur 8GB RAM hat, und die rohe Berechnung des benötigten Speichers ist 16GB zu init. Dann suche ich nach Alternativen und finde dask.

so ging ich weiter zu dask mit diesem dask.array.dot(A.T,A) und es ist fertig. Aber als ich weiß, Transformation zu dieser Matrix zu machen, und in dies kann ich erreichen, indem Sie die SVD. Aber jedes Mal, wenn ich diese SVD mache, stirbt der ipython-Kernel (ich nehme es aufgrund von fehlendem Speicher an).

das ist, was ich von init so weit zu tun, bis der Kernel stirbt:

fv_length=512*2*66 
W = da.random.randint(10,20,(fv_length),(1000,1000)) 
W = da.reshape(W,(1,fv_length)) 
W_T = W.T 
Wt = da.dot(W_T,W); del W,W_T 
Wt = da.reshape(Wt,(fv_length*fv_length/2,2)) 
U,S,Vt = da.linalg.svd(Wt); del Wt 

ich die U, S nicht bekommen, und noch Vt.

Ist meine Erinnerung einfach nicht genug, um diese Art von Dingen zu tun, auch wenn ich dask benutze? oder eigentlich ist dies kein spezifisches Problem, aber meine schlechte Speicherverwaltung? oder etwas anderes?

An diesem Punkt versuche ich verzweifelt in anderen größeren spec PC, also plane ich einen Bare-Metal-Server mit einem 32 GB RAM zu mieten. Selbst wenn ich das tue, ist es genug?

+0

Benötigen Sie die vollständige SVD oder sind Sie nur an den * N * größten singulären Werten/Vektoren interessiert? –

+0

Ich brauche die SVD, weil ich außerdem weiß, Transformation und PCA mit diesem Ergebnis tun möchten. Btw @mrocklin hat mich davon überzeugt, dass es sich lohnt, Sachen auf einer größeren Spec zu machen. Danke trotzdem – yusufazishty

+0

Sie können eine Rang * N * weiß gemachte Matrix aus den * N * -größten singulären Werten und Vektoren erzeugen. Abhängig von der Größe von * N * kann dies um viele Größenordnungen effizienter sein als die Berechnung der vollständigen SVD. –

Antwort

0

Im Allgemeinen garantiert dask.array keine Out-of-Core-Operation bei allen Berechnungen. Eine quadratische Matrix-Matrix-Multiplikation (oder irgendeine L3-BLAS-Operation) ist mehr oder weniger unmöglich, effizient in einem kleinen Speicher durchzuführen.

Sie kann fragen Sie dasask einen Cache auf der Festplatte für Zwischenwerte zu verwenden. Siehe FAQ unter der Frage Meine Berechnung füllt Speicher, wie spill ich auf die Festplatte?. Dies wird jedoch durch die Schreibgeschwindigkeiten begrenzt, die im Allgemeinen ziemlich langsam sind.

Eine große Speichermaschine und NumPy ist wahrscheinlich der einfachste Weg, um dieses Problem zu lösen. Alternativ könnten Sie versuchen, eine andere Formulierung Ihres Problems zu finden.

+0

gut danke, Ihre Antwort versichern mir, den Server sofort zu mieten – yusufazishty