Проблемы с памятью при использовании функции as.dist в R / rpy2

1

Я пытаюсь выполнить иерархическую кластеризацию с использованием специальной дистанционной меры. Я выполняю все вычисления в 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, но эти методы используют встроенные метрики расстояния.

Спасибо заранее!

Теги:
rpy2

1 ответ

2
Лучший ответ

Вызов Python del() не гарантирует, что память становится доступной для использования. Вызов сборщика мусора явно помогает. Ответ на другой вопрос здесь (Очистка памяти, используемой rpy2) указывает на соответствующий раздел в документации rpy2.

В отношении алгоритмов кластеризации иерархическая кластеризация с hclust() требует матрицу "расстояния" (размером n * (n + 1)/2; R сохраняет бит памяти, поскольку матрица симметрична). Существуют другие алгоритмы кластеризации или увлекаются иерархическими кластерными трюками, чтобы свести к минимуму размер исходной матрицы путем создания начальных блоков, но это выходит за рамки вопроса, связанного с программированием.

  • 0
    Спасибо за совет. Думаю, мне нужно переосмыслить свой подход

Ещё вопросы

Сообщество Overcoder
Наверх
Меню