Frage

Ich versuche, ein hierarchisches Clustering mit einem benutzerdefinierten Abstandsmaß durchzuführen. Ich führe alle Berechnungen in Python durch und übergebe dann die Datenstrukturen an R, um das Clustering durchzuführen.

import rpy2.robjects as robjects
r=robjects.r
from rpy2.robjects.packages import importr
stats = importr('stats')

m = r.matrix(robjects.FloatVector(list_of_data), ncol=size, byrow=True)
dist_mat=stats.as_dist(m) 
hc=stats.hclust(new_dist_mat)

Meine Entfernungsmaße werden also in einer Python-Liste gespeichert, die in eine R-Matrix konvertiert wird, die dann in ein dist-Objekt konvertiert wird, das für das Clustering erforderlich ist. Dies funktioniert bis zu einem gewissen Grad. Wenn die Matrix jedoch zu groß wird und ich den folgenden Fehler erhalte:

python(18944,0xb0081000) malloc: *** mmap(size=168898560) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 161.1 Mb

Dies tritt an dem Punkt auf, an dem ich in ein dist-Objekt (as.dist) konvertiere. Ich habe nicht getestet, bei welcher Größe es auseinander fällt, aber es funktioniert mit einer 3000x3000-Matrix, aber es schlägt mit einer 6500x6500-Matrix fehl, also irgendwo dazwischen. Ich verwende die del-Funktion in Python, um unnötige Objekte aus dem Speicher zu entfernen, aber nach dem, was ich gelesen habe, garantiert dies nicht, dass der Speicher sofort zur Verwendung verfügbar wird.

Gibt es letztendlich eine speichereffizientere Möglichkeit, ein dist-Objekt abzurufen? Oder gibt es vielleicht eine alternative Methode, die ich verwenden könnte? Ich habe einige andere Methoden in Rs cluster-Bibliothek gefunden, die kein dist-Objekt verwenden, aber diese Methoden verwenden integrierte Entfernungsmetriken.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Das Aufrufen von del () von Python garantiert nicht, dass der Speicher sofort zur Verwendung verfügbar wird.Das explizite Aufrufen des Garbage Collector hilft.Die Antwort auf eine andere Frage hier (

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top