增加与乘法内存使用错误分配?

mmf*_*pds 3 memory r vector multiplication addition

假设您在运行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个核心,12个逻辑处理器.

现在让.

memory.limit(99999)
test1<-rep((1001:2000)/100,60)
Ta<-outer(-test1,test1,"+")
Run Code Online (Sandbox Code Playgroud)

"错误:无法分配大小为26.8 Gb的矢量"

gc()
Tm<-outer(-test1,test1,"*")
length(Tm)
[1] 3.6e+09
Run Code Online (Sandbox Code Playgroud)

为什么会这样?注意,rep中使用的数字60可以减少,以便使用外部和增加成功进行加法和乘法,以便两者均等地失败.为什么存在这种不均匀的阈值,为什么在这种意义上增加使用的内存多于乘法呢?

MrF*_*ick 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, ...)
}
Run Code Online (Sandbox Code Playgroud)

因此,当您进行乘法运算时,您可以利用矩阵乘法运算,这些运算在CPU上更容易优化.

在将函数应用于它们之前,另一个分支首先需要扩展所有值.这种扩展即使在调用函数之前也会分配内存.