R:Оптимизация/Предварительное выделение памяти
< R:Оптимизация |
Материал «R:Оптимизация/Предварительное выделение памяти», созданный автором Артём Клевцов, публикуется на условиях лицензии Creative Commons «Attribution» («Атрибуция») 4.0 Всемирная. | |
|
Перед использованием функций из пакетов их необходимо предварительно установить и загрузить: КодR <syntaxhighlight lang="r">> install.packages(pkgs = "pkgname") > library(package = "pkgname")</syntaxhighlight> |
Предварительное выделение памяти
Частой задачей, решаемой с помощью циклов, является выполнение расчётов и занесение результатов в переменную. Таким образом, результирующая переменная будет заполняться данными по мере работы цикла. Предварительное выделение памяти (preallocate) позволяет ускорить работу циклов, работающих с постепенной заполняемыми данными. Суть данного метода заключается в том, чтобы заранее выделить место в оперативной памяти, в которую будут записываться данные во время работы цикла. Выделение памяти осуществляется путём указания типа и размера переменной. Если этого не сделать, то при каждой новой итерации необходимо выделять новое место в памяти и производить туда запись.
Обратите внимание, что переменные, участвующие в цикле, должны быть объявлены до того, как будут использоваться.
<syntaxhighlight lang="r">> noaaloc <- function(n) { + x <- NULL # объявляем пустую переменную + for (i in seq_len(n)) + x[i] <- i * i + x + } > > alloc <- function(n) { + x <- integer(n) # объявляем переменную нужного типа и размера + for (i in seq_len(n)) + x[i] <- i * i + x + } > microbenchmark(noaaloc(10^4), alloc(10^4)) Unit: milliseconds expr min lq median uq max neval noaaloc(10^4) 41.746 42.719 43.353 44.603 76.31 100 alloc(10^4) 5.524 5.896 6.019 6.777 27.35 100</syntaxhighlight>