Итак, я думаю, что не совсем понимаю, как работает память в 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)
в цикле)
Вот график toc, после использования предварительного выделения для x (т.е. используя x[]=runif(50)
в цикле)
Я не делаю то, что думаю? Что происходит под капотом, когда я очищаю рабочее пространство?
Обновление: с новейшей версией R (3.1.0), проблема больше не сохраняется даже при увеличении N до N = 3e8 (примечание R не позволяет векторам слишком много больше этого )
Хотя довольно неудовлетворительно, что исправление просто обновляет R до самой новой версии, потому что я не могу понять, почему в версии 2.15 возникли проблемы. Было бы неплохо узнать, что их вызвало, поэтому я продолжу оставлять этот вопрос открытым.