加法与乘法内存使用分配不当?
Addition versus Multiplication Memory Usage misallocation?
假设您在基于 x64 的 PC 上 运行 Rx64 3.5.1 运行 Windows 10 Version 10.0.17134 Build 17134。系统有 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,"+")
"Error: cannot allocate vector of size 26.8 Gb"
gc()
Tm<-outer(-test1,test1,"*")
length(Tm)
[1] 3.6e+09
为什么会这样?请注意,可以减少 rep 中使用的数字 60 以获得使用 outer 的加法和乘法的成功,也可以增加数字 60 以使两者同样失败。为什么存在这样一个不均匀的阈值,为什么在这个意义上加法比乘法使用更多的内存?
如果您查看 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 上更容易优化。
另一个分支首先需要展开所有值,然后再将函数应用于它们。这种扩展就是在调用函数之前分配内存的原因。
假设您在基于 x64 的 PC 上 运行 Rx64 3.5.1 运行 Windows 10 Version 10.0.17134 Build 17134。系统有 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,"+")
"Error: cannot allocate vector of size 26.8 Gb"
gc()
Tm<-outer(-test1,test1,"*")
length(Tm)
[1] 3.6e+09
为什么会这样?请注意,可以减少 rep 中使用的数字 60 以获得使用 outer 的加法和乘法的成功,也可以增加数字 60 以使两者同样失败。为什么存在这样一个不均匀的阈值,为什么在这个意义上加法比乘法使用更多的内存?
如果您查看 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 上更容易优化。
另一个分支首先需要展开所有值,然后再将函数应用于它们。这种扩展就是在调用函数之前分配内存的原因。