2011-03-18 63 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