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

标签 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 对象,但这些方法使用内置距离度量。

提前致谢!

最佳答案

调用 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/

相关文章:

r - 使用 ggridges 可视化泊松随机样本组

r - 是否可以使用 rmarkdown 在revealjs 演示文稿中包含引用书目?

python - 如何在Rpy2中使用lattice并将结果保存为pdf?

Python 和 rpy2 : How do I adjust/clear a graphic during runtime?

python - 如何使用 rpy2 在 Python 中访问 .Rdata 文件中的矩阵

python - 使用 bool 掩码过滤 Pandas 数据框

python maketrans和translate的C#等价

r - 将对象名称传递给 do.call() 函数

python - 使用 Anaconda 安装后无法导入包

python - 从python中的元组中获取具有值的项目