/ / Problemi di memoria con la funzione as.dist in R / rpy2 - python, r, rpy2

Problemi di memoria con la funzione as.dist in R / rpy2 - python, r, rpy2

Sto cercando di eseguire un clustering gerarchico usando una misura della distanza personalizzata. Eseguo tutti i calcoli in Python e poi passo le strutture dati a R per fare il clustering

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)

Quindi le mie misure di distanza sono contenute in una lista Python, convertita in una matrice R, che viene poi convertita in a dist oggetto richiesto per il clustering. Questo funziona in parte. Tuttavia, quando la matrice diventa troppo grande e ottengo questo errore:

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

Ciò si verifica nel punto in cui converto in a dist oggetto (as.dist). Non ho provato a quale dimensione cada a pezzi, ma funziona con una matrice 3000x3000, ma fallisce con una matrice 6500x6500, quindi da qualche parte nel mezzo. Sto usando il del funzione in Python per provare a rimuovere dalla memoria eventuali oggetti non necessari, ma da quello che ho letto non garantisce che la memoria sia immediatamente disponibile per l'uso.

Quindi, alla fine, c'è un modo più efficiente di memoria per ottenere un dist oggetto? O c'è forse un metodo alternativo che potrei usare? Ho trovato altri metodi in R "s cluster libreria, che non usa a dist oggetto, ma questi metodi utilizzano metriche di distanza incorporate.

Grazie in anticipo!

risposte:

2 per risposta № 1

Chiamare Python "s del () non garantisce che la memoria sia immediatamente disponibile per l'uso. Chiamare il garbage collector aiuta esplicitamente. La risposta ad un'altra domanda qui (Cancellazione della memoria utilizzata da rpy2) punta alla sezione pertinente nella documentazione di rpy2.

Per quanto riguarda gli algoritmi di clustering gerarchicoil clustering con hclust () richiede una matrice "distanza" (di dimensione n * (n + 1) / 2; R salva un po 'di memoria poiché la matrice è simmetrica). Esistono altri algoritmi di clustering, o se siete appassionati di trucchi di clustering gerarchici per minimizzare la dimensione della matrice di partenza creando blocchi iniziali, ma questo è al di fuori dell'ambito di una domanda relativa alla programmazione.