Сложение против умножения Использование памяти Распределение памяти? - PullRequest
0 голосов
/ 08 октября 2018

Предположим, что вы работаете с Rx64 3.5.1 на компьютере x64 под управлением Windows 10 версии 10.0.17134, сборка 17134. Система имеет 16 ГБ физической памяти.Процессор Intel Core i7-8700K CPU @ 3,70 ГГц, 3696 МГц, 6 ядер, 12 логических процессоров.

Now let.

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

"Ошибка: невозможно выделить вектор размером 26,8Gb "

gc()
Tm<-outer(-test1,test1,"*")
length(Tm)
[1] 3.6e+09

Почему это происходит?Обратите внимание, что число 60, используемое в повторении, может быть уменьшено, чтобы получить успех как для сложения, так и для умножения с использованием внешнего, а также увеличено, чтобы оба одинаково терпели неудачу.Почему существует такой неравномерный порог и почему сложение использует больше памяти, чем умножение в этом смысле?

1 Ответ

0 голосов
/ 12 октября 2018

Если вы посмотрите на источник для 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, ...)
}

Так что, когда вы делаете умножение, вы получаете преимуществооперации умножения матриц, которые намного проще оптимизировать на процессоре.

Другая ветвь должна сначала развернуть все значения, прежде чем применять к ним функцию.Это расширение выделяет память еще до вызова функции.

...