2011-03-18 65 views
1

as.dist功能內存的問題我想執行使用自定義的距離度量一個層次聚類。我執行Python中所有的計算,然後通過數據結構與R做聚類與R/rpy2

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的矩陣中失敗,所以在中間的某處。 我使用Python中del函數嘗試從內存中刪除任何不必要的對象,但是從我讀過這並不能保證內存將立即可用。

因此,最終,有沒有更多的內存高效的方式來獲得dist對象?或者,我可以使用另一種方法嗎?我發現R中的cluster圖書館借了一些其他的方法,不使用dist對象,但這些方法都使用內置的距離度量。

在此先感謝!

回答

2

調用Python的德爾()不保證存儲正成爲立即可用。顯式調用垃圾收集器有幫助。這裏的其他問題(Clearing memory used by rpy2)的答案指向了rpy2文檔中的相關部分。

關於聚類算法hclust()的分層聚類確實需要一個「距離」矩陣(大小爲n *(n + 1)/ 2; R因爲矩陣是對稱的,所以節省了一點內存)。還有其他聚類算法,或者如果熱衷於分層聚類技巧,通過創建初始塊來最小化起始矩陣的大小,但這不在編程相關問題的範圍之內。

+0

謝謝你的建議。猜猜我需要重新思考我的方法 – steiny 2011-03-21 11:03:57