我对这件事完全不知所措。我在R (48000 * 19)中为我的数据帧有一个大的,虽然不是不合理的矩阵。我试图使用sm.ancova()来研究微分效应斜率,但是
error: cannot allocate vector of size 13.1GB分配给R的内存超过了13 get,我明白了。但是..。什么?!我读取的整个CSV文件只有24,000 in。为什么这些单个向量在R中如此巨大?
我使用的ancova代码是:
data1<-read.csv("data.csv")
attach(data1)
sm.ancova(s,dt,dip,model="none") 看了看,我用了:
diag(s)
length(s)
diag(dt)
length(dt)
diag(dip)
length(dip)这都给出了同样的错误。它们的长度都是48000。
任何解释都会有帮助。修复更好:)
提前感谢!
复制此问题的虚拟数据链接可以在:https://www.dropbox.com/s/dxxofb3o620yaw3/stackexample.csv?dl=0中找到。
发布于 2016-10-12 19:38:21
获取数据:
## 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矩阵是
format(object.size(diag(1000)),"Mb") ## 7.6 Mb所以你要在这里构造的矩阵是96^2*7.6/1024 = 68 Gb。
一个24Kx24K矩阵将是16倍小,但仍约4GB.
可以使用稀疏矩阵构造大对角线矩阵:
library(Matrix)
object.size(Diagonal(x=1:96000))
## 769168 bytes更普遍的是,并不是所有的分析程序都考虑到计算效率(无论是速度还是内存)。这一方法所依据的论文(?sm.ancova)是在1990年代后期编写的,当时有24,000次观测将构成一个庞大的数据集.
https://stackoverflow.com/questions/40005437
复制相似问题