Подтвердить что ты не робот

Почему R замедляется с течением времени, когда вычисления одинаковы?

Итак, я думаю, что не совсем понимаю, как работает память в R. Я столкнулся с проблемами, когда один и тот же фрагмент кода становится медленнее на следующей неделе (используя ту же сессию R - иногда даже когда я очищаю рабочее пространство). Я пытался разработать игрушечную проблему, которая, как я думаю, воспроизводит "замедление", наблюдаемое при работе с большими объектами. Обратите внимание, что приведенный ниже код имеет несколько интенсивный объем памяти (не слепо запускайте этот код, не настраивая n и N, чтобы он соответствовал вашим настройкам). Обратите внимание, что, вероятно, вам понадобится около 5-10 минут, прежде чем вы начнете видеть этот замедляющий шаблон (возможно, даже дольше).

N=4e7 #number of simulation runs
n=2e5 #number of simulation runs between calculating time elapsed
meanStorer=rep(0,N);
toc=rep(0,N/n);
x=rep(0,50);

for (i in 1:N){
  if(i%%n == 1){tic=proc.time()[3]}
  x[]=runif(50);
  meanStorer[i] = mean(x);
  if(i%%n == 0){toc[i/n]=proc.time()[3]-tic; print(toc[i/n])}
} 
plot(toc)

meanStorer, конечно, большой, но он предварительно выделен, поэтому я не уверен, почему цикл замедляется с течением времени. Если я очищу рабочее пространство и снова запустим этот код, он запустится так же медленно, как и последние вычисления! Я использую Rstudio (в случае, если это имеет значение). Также приведена некоторая информация о моей системе

  • ОС: Windows 7
  • Тип системы: 64-разрядный
  • RAM: 8gb
  • R версия: 2.15.1 ($ platform дает "x86_64-pc-mingw32" )

Вот график toc, прежде чем использовать предварительное выделение для x (т.е. используя x=runif(50) в цикле)

enter image description here

Вот график toc, после использования предварительного выделения для x (т.е. используя x[]=runif(50) в цикле)

enter image description here

Я не делаю то, что думаю? Что происходит под капотом, когда я очищаю рабочее пространство?

Обновление: с новейшей версией R (3.1.0), проблема больше не сохраняется даже при увеличении N до N = 3e8 (примечание R не позволяет векторам слишком много больше этого )

enter image description here

Хотя довольно неудовлетворительно, что исправление просто обновляет R до самой новой версии, потому что я не могу понять, почему в версии 2.15 возникли проблемы. Было бы неплохо узнать, что их вызвало, поэтому я продолжу оставлять этот вопрос открытым.

4b9b3361

Ответ 1

Как вы заявляете в своем обновленном вопросе, ответ высокого уровня заключается в том, что вы используете старую версию R с ошибкой, поскольку с новейшей версией R (3.1.0) проблема больше не сохраняется.