Python R/rpy2中as.dist函数的内存问题

Python R/rpy2中as.dist函数的内存问题,python,r,rpy2,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=st

我正在尝试使用自定义距离度量执行分层聚类。我用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的
集群
库中发现了一些其他方法,它们不使用
dist
对象,但这些方法使用内置的距离度量

提前谢谢

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


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

谢谢你的建议。我想我需要重新考虑我的方法