gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:12:01 26 4
gpt4 key购买 nike

我正在尝试使用自定义距离度量来执行层次聚类。我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com