0

我的功能有一些问题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 内存和 1 Tera 硬盘的电脑。

我还尝试使用dist包代理中的函数做一个 dist 矩阵:

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

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

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

4

1 回答 1

0

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

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

于 2013-02-08T23:47:34.950 回答