首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >素食主义者:双倍错误(N *(N- 1)/2):指定的向量大小太大

素食主义者:双倍错误(N *(N- 1)/2):指定的向量大小太大
EN

Stack Overflow用户
提问于 2013-02-08 23:03:02
回答 1查看 1.8K关注 0票数 0

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

问题是我有一个由138037行(站点)和89列(物种)组成的矩阵。我的剧本是:

代码语言:javascript
复制
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")

或更可责备的:

代码语言:javascript
复制
nsites <- 138037
nspp <- 89
DF <- matrix(0,nrow=nsites,ncol=nspp)
DISTAN=vegdist(DF,"jaccard")

它几乎立即产生错误:

代码语言:javascript
复制
Error in double(N * (N - 1)/2) : vector size specified is too large

我认为这是一个内存错误,但我不知道为什么,如果我有一个32´的内存和1Tera硬盘的pc。

我还尝试使用package的函数dist执行dist矩阵:

代码语言:javascript
复制
library(proxy)
vector=dist(DF, method = "Jaccard")

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

我真的不知道这是怎么回事,怎么解决这个问题,有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2013-02-08 23:47:34

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的开发版本 (搜索“长向量”)中是放松的;参见R中向量的最大长度。但是,更大的问题是:您实际上打算用一个包含100亿个不同元素的距离矩阵来做吗?如果你更多地解释一下你想要做的事情的背景,你可能会得到一些更有用的答案(例如,不仅仅是“为什么会发生这种事?”但是“我能做些什么呢?”)。没有更多的上下文,我所能说的就是“尝试切换到R的开发版本,看看它是否有用”(但它可能没有帮助;长向量并不支持R的所有方面,尤其是在使用底层C或FORTRAN源代码的代码中)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14782758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档