Я запускаю R на рабочей станции Ubuntu с 8 виртуальными ядрами и 8 ГБ RAM. Я надеялся регулярно использовать многоядерный пакет для одновременного использования 8 ядер; однако я считаю, что весь процесс R дублируется 8 раз. Поскольку на самом деле R, похоже, использует гораздо больше памяти, чем указано в gc (в 5 раз, даже после gc()), это означает, что даже относительно мягкое использование памяти (один объект 200 Мб) становится неумолимо тяжелым в памяти, раз дублируется 8 раз, Я заглянул в bigmemory, чтобы дочерние процессы имели одинаковое пространство памяти; но для этого потребуется некоторое серьезное переписывание моего кода, поскольку оно не касается файлов данных.
Есть ли способ сделать R максимально возможным, как можно раньше, перед разветвлением, т.е. заставить ОС восстановить как можно больше памяти?
EDIT: Кажется, я понимаю, что происходит сейчас. Проблема не в том, где я думал, что это - объекты, которые существуют в родительском потоке и не управляются, не дублируются восемь раз. Вместо этого моя проблема, я полагаю, исходила из характера манипуляции, которую я делаю, чтобы каждый дочерний процесс выполнялся. Каждый из них должен манипулировать большим фактором с сотнями тысяч уровней, и я думаю, что это бит памяти. В результате, действительно, общая загрузка памяти пропорциональна количеству ядер; но не так драматично, как я думал. Еще один урок, который я узнал, заключается в том, что с 4-мя физическими ядрами + возможностью гиперпоточности гиперпоточность на самом деле обычно не является хорошей идеей для R. Прирост минимален, а стоимость памяти может быть нетривиальной. Итак, теперь я буду работать с 4 ядрами.
Для тех, кто хочет экспериментировать, это тип кода, который я запускал:
# Create data
sampdata <- data.frame(id = 1:1000000)
for (letter in letters) {
sampdata[, letter] <- rnorm(1000000)
}
sampdata$groupid = ceiling(sampdata$id/2)
# Enable multicore
library(multicore)
options(cores=4) # number of cores to distribute the job to
# Actual job
system.time(do.call("cbind",
mclapply(subset(sampdata, select = c(a:z)), function(x) tapply(x, sampdata$groupid, sum))
))