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

1 投票
1 回答
602 浏览
提问于 2025-04-16 13:58

我正在尝试使用自定义的距离测量方法进行层次聚类。我在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 个回答

2

在Python中,调用del()并不能保证内存会立刻变得可用。要想让内存更快释放,手动调用垃圾回收器会有帮助。这里有个其他问题的答案提到了一些相关内容,可以参考一下rpy2的文档。

关于聚类算法,使用hclust()进行层次聚类时,需要一个“距离”矩阵(大小为n * (n + 1) / 2;因为这个矩阵是对称的,R会节省一些内存)。还有其他聚类算法,如果你对层次聚类感兴趣,可以通过创建初始块来减少起始矩阵的大小,但这些内容超出了编程相关问题的范围。

撰写回答