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

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

Заранее спасибо!

1 Ответ

2 голосов
/ 19 марта 2011

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

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

...