r-vegan::vegdist:双精度错误(N*(N-1)/2):指定的矢量大小太大

  • 本文关键字:vegdist 双精度 N-1 r-vegan 错误 vegan
  • 更新时间 :
  • 英文 :


我对vegdist函数有一些问题。我想用jaccard计算一个距离矩阵。我有二进制数据。

问题是,我有一个138037行(地点)和89列(物种)的矩阵。我的脚本是:

library("vegan")
memory.limit(size = 100000) # it gives  1 Tera  from HDD in case ram memory is over
DF=as.data.frame(MODELOS)
DF=na.omit(DF)
DISTAN=vegdist(DF[,2:ncol(DF)],"jaccard")

或者更具可复制性:

nsites <- 138037
nspp <- 89
DF <- matrix(0,nrow=nsites,ncol=nspp)
DISTAN=vegdist(DF,"jaccard")

它几乎立即产生错误:

Error in double(N * (N - 1)/2) : vector size specified is too large

我认为这是内存错误,但我不知道为什么如果我有一台32GB内存和1Tra硬盘的电脑。

我还尝试使用packageproxy:中的函数dist来做一个dist矩阵

library(proxy)
vector=dist(DF, method = "Jaccard")

它开始运行,但当它达到10GB的ram时,一个窗口宣布R犯了一个错误,它将关闭,所以它关闭并开始一个新的部分。

我真的不知道发生了什么,更不知道如何解决这个问题,有人能帮我吗?

N <- 138037; log10(N*(N-1)/2)显示您正在尝试计算具有10^9.98=几乎10^10(100亿)个不同元素的dist对象。已发布的R版本只能处理元素少于2^31-1的对象(log10(2^31-1)=9.3),而不考虑可用内存量。在R的开发版本中放宽了这一限制(搜索"LONG VECTORS");另请参阅R中向量的最大长度。不过,更大的问题是:对于具有100亿个不同元素的距离矩阵,您实际上计划做什么???如果你多解释一下你想做的事情的背景,你可能会得到一些更有用的答案(即,不仅是"为什么会发生这种事?",还有"我能做些什么?")。如果没有更多的上下文,我只能说"试着切换到R的开发版本,看看这是否有帮助"(但可能没有;长向量在R的所有方面都不受支持,尤其是在使用底层C或FORTRAN源代码的代码中)。

我不知道为什么proxy::dist会给出不同的错误行为。

最新更新