r语言 - 加法与乘法内存用法分配错误?



假设您在运行 Windows 10 版本 10.0.17134 内部版本 17134 的基于 x64 的电脑上运行 Rx64 3.5.1。系统具有 16 GB 的物理内存。处理器是英特尔酷睿 i7-8700K CPU @ 3.70GHz,3696 Mhz,6 核,12 逻辑处理器。

现在让我们。

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 可以减小以使用 outer 获得加法和乘法的成功,也可以增加以使两者均等地失败。为什么存在如此不均匀的脱粒,为什么在这个意义上加法使用比乘法更多的内存?

如果你查看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 上更容易优化。

另一个分支首先需要展开所有值,然后再将函数应用于它们。这种扩展甚至在调用函数之前就分配了内存。

最新更新