Я использую R на рабочей станции Ubuntu с 8 виртуальными ядрами и 8 ГБ оперативной памяти.Я надеялся регулярно использовать многоядерный пакет, чтобы использовать 8 ядер параллельно;однако я считаю, что весь процесс R дублируется 8 раз.Поскольку кажется, что R фактически использует гораздо больше памяти, чем сообщается в gc (в 5 раз, даже после gc ()), это означает, что даже относительно умеренное использование памяти (один объект 200 МБ) становится непозволительно тяжелым, после дублирования 8 раз,Я изучил большую память, чтобы дочерние процессы разделяли одно и то же пространство памяти;но это потребовало бы некоторого серьезного переписывания моего кода, так как он не имеет отношения к фреймам данных.
Есть ли способ сделать R как можно более обедненным, прежде чем разветвляться, то есть освободить ли ОС столько памяти, сколько возможно?
РЕДАКТИРОВАТЬ: Я думаю, что я понимаю, что происходит сейчас.Проблема не в том, где я думал - объекты, которые существуют в родительском потоке и не обрабатываются, не дублируются восемь раз.Вместо этого моя проблема, я полагаю, возникла из-за характера манипуляций, которые я заставляю выполнять каждый дочерний процесс.Каждый из них должен манипулировать большим фактором с сотнями тысяч уровней, и я думаю, , это - это большой объем памяти.В результате это действительно тот случай, когда общая загрузка памяти пропорциональна количеству ядер;но не так драматично, как я думал.Другой урок, который я выучил, состоит в том, что с 4 физическими ядрами + возможностью гиперпоточности, гиперпоточность обычно не является хорошей идеей для R. Усиление минимально, а стоимость памяти может быть нетривиальной.Так что теперь я буду работать над четырьмя ядрами.
Для тех, кто хотел бы поэкспериментировать, это тип кода, который я запускал:
# 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))
))