如何在iCAMP::bNRI.cm()中使用big.matrix.descriptor格式的大型进化距离矩阵?
问题:将big.matrix.descriptor传入iCAMP::bNRI.cm()的dis参数(低内存占用)
我希望使用iCAMP::bNRI.cm()函数,但该函数要求系统发育距离矩阵为实际矩阵类型。我的矩阵规模庞大,已保存为big.matrix.descriptor格式:
new("big.matrix.descriptor", description = list(sharedType = "FileBacked", filename = "pd.bin", dirname = "/dirpath/", totalRows = 5122L, totalCols = 5122L, rowOffset = c(0, 5122 ), colOffset = c(0, 5122), nrow = 5122, ncol = 5122, rowNames = NULL, colNames = NULL, type = "double", separated = FALSE))
我可以将其加载为descriptor对象,请问如何在不占用过多内存的情况下,将该descriptor指定为iCAMP::bNRI.cm()的dis参数?示例调用代码如下:
bnri.whole <- bNRI.cm(comm=otu, dis=descriptor?, nworker = 4, memo.size.GB = 50...)
解决方案
1. 加载descriptor为文件-backed的big.matrix对象
使用bigmemory包的attach.big.matrix()函数,将descriptor映射为磁盘-backed的big.matrix对象,该对象不会将整个矩阵加载到内存,仅在需要时读取磁盘数据:
library(bigmemory) # 假设你的descriptor对象已加载,名为pd_desc pd_big <- attach.big.matrix(pd_desc)
2. 直接传入bNRI.cm()的dis参数
big.matrix类支持标准的矩阵索引操作,若bNRI.cm()内部通过常规索引访问矩阵元素,可直接将pd_big传入dis参数:
library(iCAMP) bnri.whole <- bNRI.cm(comm = otu, dis = pd_big, nworker = 4, memo.size.GB = 50)
3. 备选方案:内存可控时转换为普通矩阵
针对你当前5122×5122的矩阵,转换为普通矩阵的内存占用约200MB,多数场景下可直接执行:
pd_matrix <- as.matrix(pd_big) bnri.whole <- bNRI.cm(comm = otu, dis = pd_matrix, nworker = 4, memo.size.GB = 50)
内容的提问来源于stack exchange,提问作者Geomicro
相关产品推荐
相关产品推荐

