首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以R表示的奇怪的列表大小,解释?

以R表示的奇怪的列表大小,解释?
EN

Stack Overflow用户
提问于 2016-10-12 18:04:41
回答 1查看 296关注 0票数 1

我对这件事完全不知所措。我在R (48000 * 19)中为我的数据帧有一个大的,虽然不是不合理的矩阵。我试图使用sm.ancova()来研究微分效应斜率,但是

代码语言:javascript
复制
error: cannot allocate vector of size 13.1GB

分配给R的内存超过了13 get,我明白了。但是..。什么?!我读取的整个CSV文件只有24,000 in。为什么这些单个向量在R中如此巨大?

我使用的ancova代码是:

代码语言:javascript
复制
data1<-read.csv("data.csv")
attach(data1)
sm.ancova(s,dt,dip,model="none") 

看了看,我用了:

代码语言:javascript
复制
diag(s)
length(s)
diag(dt)
length(dt)
diag(dip)    
length(dip)

这都给出了同样的错误。它们的长度都是48000。

任何解释都会有帮助。修复更好:)

提前感谢!

复制此问题的虚拟数据链接可以在:https://www.dropbox.com/s/dxxofb3o620yaw3/stackexample.csv?dl=0中找到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-12 19:38:21

获取数据:

代码语言:javascript
复制
## CSV file is 10M on disk, so it's worth using a faster method
##   than read.csv() to import ...
data1 <- data.table::fread("stackexample.csv",data.table=FALSE)
dd <- data1[,c("s","dt","dip")]

如果你给diag()一个向量,它会尝试用对角上的向量构造一个对角矩阵。您给出的示例数据集长为96,000行,因此应用于任何元素的diag()将试图构造一个96,000 x 96,000矩阵。一个1000x1000矩阵是

代码语言:javascript
复制
format(object.size(diag(1000)),"Mb")  ## 7.6 Mb

所以你要在这里构造的矩阵是96^2*7.6/1024 = 68 Gb。

一个24Kx24K矩阵将是16倍小,但仍约4GB.

可以使用稀疏矩阵构造大对角线矩阵:

代码语言:javascript
复制
library(Matrix)
object.size(Diagonal(x=1:96000))
## 769168 bytes

更普遍的是,并不是所有的分析程序都考虑到计算效率(无论是速度还是内存)。这一方法所依据的论文(?sm.ancova)是在1990年代后期编写的,当时有24,000次观测将构成一个庞大的数据集.

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

https://stackoverflow.com/questions/40005437

复制
相关文章

相似问题

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