Я пытаюсь выполнить иерархическую кластеризацию, используя пользовательскую меру расстояния.Я выполняю все вычисления в Python, а затем передаю структуры данных в R, чтобы выполнить кластеризацию
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)
Таким образом, мои меры расстояния хранятся в списке Python, преобразованном в матрицу R, которая затем преобразуется вdist
объект, необходимый для кластеризации.Это работает до определенной степени.Однако, когда матрица становится слишком большой, и я получаю эту ошибку:
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
Это происходит в точке, где я преобразую в dist
объект (as.dist
).Я не проверял, в каком размере он распадается, но он работает с матрицей 3000x3000, но не работает с матрицей 6500x6500, так что где-то между ними.Я использую функцию del
в Python, чтобы попытаться удалить все ненужные объекты из памяти, но из того, что я прочитал, это не гарантирует, что память станет немедленно доступной для использования.
Итак,в конечном счете, есть ли более эффективный способ памяти для получения объекта dist
?Или, может быть, есть альтернативный метод, который я мог бы использовать?Я нашел некоторые другие методы в библиотеке R cluster
, которые не используют объект dist
, но эти методы используют встроенные метрики расстояния.
Заранее спасибо!