内存问题与R / rpy2中的as.dist函数有关

时间:2011-03-18 16:17:11

标签: python r rpy2

我正在尝试使用自定义距离度量执行分层聚类。我在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矩阵失败,所以介于两者之间。 我在Python中使用del函数尝试从内存中删除任何不必要的对象,但从我读过的内容并不能保证内存可以立即使用。

那么,最终是否有一种更有效的内存来获取dist对象?或者可能有一种我可以使用的替代方法?我在R的cluster库中找到了一些不使用dist对象的其他方法,但这些方法使用了内置的距离度量。

提前致谢!

1 个答案:

答案 0 :(得分:2)

调用Python的del()并不能保证内存可以立即使用。调用垃圾收集器显然有帮助。这里的另一个问题(Clearing memory used by rpy2)的答案指向rpy2文档中的相关部分。

关于聚类算法,使用hclust()的分层聚类确实需要“距离”矩阵(大小为n *(n + 1)/ 2; R因为矩阵是对称的而节省了一点内存)。存在其他聚类算法,或者如果热衷于分层聚类技巧以通过创建初始块来最小化起始矩阵的大小,但这超出了与编程相关的问题的范围。