我正在尝试使用自定义距离度量来执行层次聚类。我在 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
对象,但这些方法使用内置距离度量。
提前致谢!
最佳答案
调用 Python 的 del() 并不能保证内存立即可供使用。显式调用垃圾收集器会有所帮助。此处另一个问题的答案 ( Clearing memory used by rpy2 ) 指向 rpy2 文档中的相关部分。
关于聚类算法,使用 hclust() 进行分层聚类确实需要一个“距离”矩阵(大小为 n * (n + 1)/2 ;由于矩阵是对称的,R 节省了一些内存)。还存在其他聚类算法,或者热衷于分层聚类技巧,通过创建初始 block 来最小化起始矩阵的大小,但这超出了与编程相关的问题的范围。
关于python - R/rpy2 中 as.dist 函数的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5354840/