2011-03-18 3 views
1

사용자 정의 거리 측정을 사용하여 계층 적 클러스터링을 수행하려고합니다. 나는 다음 dist로 변환 그래서 내 거리를 측정 파이썬 목록에서 개최된다 R/rpy2의 as.dist 기능과 관련된 메모리 문제

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) 

이는 R 행렬로 변환 클러스터링을 수행하는 R에 데이터 구조를 파이썬에서 모든 계산을 수행 한 후 통과 클러스터링에 필요한 오브젝트. 이것은 어느 정도 효과가 있습니다.

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 함수를 사용하여 메모리에서 불필요한 객체를 제거하려고 시도했지만, 읽은 바대로 메모리를 즉시 사용할 수 있음을 보장하지 않습니다.

따라서 궁극적으로 dist 개체를 가져 오는 메모리 효율적인 방법이 있습니까? 아니면 내가 사용할 수있는 대체 방법이 있을까요? 나는 dist 객체를 사용하지 않는 R의 cluster 라이브러리에서 몇 가지 다른 방법을 찾았지만 이러한 방법은 내장 된 거리 메트릭을 사용합니다.

미리 감사드립니다.

답변

2

파이썬의 del()을 호출한다고해서 메모리가 즉시 사용 가능 해지는 것은 아닙니다. 가비지 컬렉터를 명시 적으로 호출하면 도움이됩니다. 다른 질문 (Clearing memory used by rpy2)에 대한 답은 rpy2 문서의 관련 섹션을 가리 킵니다.

클러스터링 알고리즘 hclust()를 사용한 계층 적 클러스터링은 크기가 n * (n + 1)/2 인 "거리"행렬이 필요하지만 행렬은 대칭이므로 메모리를 절약합니다. 다른 클러스터링 알고리즘이 있거나 초기 블록을 작성하여 시작 매트릭스의 크기를 최소화하기 위해 계층 적 클러스터링 트릭을 선호하는 경우 프로그래밍 관련 질문의 범위를 벗어납니다.

+0

감사합니다. 내 접근 방식을 재고해야 겠네요. – steiny