vegan :: vegdist:double中的错误(N *(N - 1)/ 2):指定的矢量大小太大

时间:2013-02-08 23:03:03

标签: r 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的RAM和1 Tera的硬盘。

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

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

它开始运行但是当它达到10 GB的ram时,一个窗口宣布R提交了一个错误并且它将关闭,因此它关闭并开始一个新的部分。

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

1 个答案:

答案 0 :(得分:0)

N <- 138037; log10(N*(N-1)/2)表示您正在尝试使用10 ^ 9.98 =几乎10 ^ 10(100亿)个不同元素计算dist个对象。无论可用内存量多少,R的发布版本只能处理少于2 ^ 31-1个元素(log10(2^31-1)=9.3)的对象。 the development version of R(搜索“长传”)放宽了此限制;另见Max Length for a Vector in R。更大的问题是:你实际上计划用一个具有100亿个不同元素的距离矩阵?如果你再解释一下你正在尝试做的事情的背景,你可能会得到一些更有用的答案(即不仅仅是“为什么会发生这种情况?”而是“我该怎么办呢?”)。没有更多的上下文,我只能说“尝试切换到R的开发版本,看看是否有帮助”(但它可能不会; R的所有方面都不支持长向量,特别是在使用底层C的代码中不支持或FORTRAN来源)。

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