假设您正在运行Windows 10版本10.0.17134 Build 17134的基于x64的PC上运行Rx64 3.5.1。系统具有16 GB的物理内存。该处理器是Intel Core i7-8700K CPU @ 3.70GHz,3696 Mhz,6 Cores,12 Logical Processors。
现在开始。
memory.limit(99999)
test1<-rep((1001:2000)/100,60)
Ta<-outer(-test1,test1,"+")
“错误:无法分配大小为26.8 Gb的向量”
gc()
Tm<-outer(-test1,test1,"*")
length(Tm)
[1] 3.6e+09
为什么会这样?请注意,rep中使用的数字60可以减少以使用外部的加法和乘法获得成功,也可以增加以使两者均等地失败。为什么存在这种不均匀的阈值?在这种意义上,为什么加法使用的内存多于乘法?
答案 0 :(得分:5)
如果您查看outer
的来源,您会发现乘法有特殊情况(*
)
robj <- if (is.character(FUN) && FUN == "*") {
if (!missing(...))
stop("using ... with FUN = \"*\" is an error")
as.vector(X) %*% t(as.vector(Y))
}
else {
FUN <- match.fun(FUN)
Y <- rep(Y, rep.int(length(X), length(Y)))
if (length(X))
X <- rep(X, times = ceiling(length(Y)/length(X)))
FUN(X, Y, ...)
}
因此,当您进行乘法运算时,您可以利用矩阵乘法运算,该运算在CPU上更容易优化。
另一个分支首先需要扩展所有值,然后再将函数应用到它们。这种扩展就是在调用函数之前就分配了内存。