Утечка памяти при использовании пакета MNP в R - PullRequest
4 голосов
/ 19 октября 2011

У меня есть вопрос, касающийся использования памяти в R при использовании пакета MNP. Моя цель состоит в том, чтобы оценить полиномиальную пробитную модель, а затем использовать модель для прогнозирования выбора на большом наборе данных. Я разделил данные предиктора в списке частей.

Проблема в том, что когда я зацикливаюсь на списке для предсказания, память, используемая R, постоянно увеличивается и использует пространство подкачки после достижения максимальной памяти моего компьютера. Выделенная память не освобождается даже при достижении этих границ. Это происходит, хотя я не создаю никаких дополнительных объектов и поэтому не понимаю, что происходит.

Ниже я вставил пример кода, который страдает от описанной проблемы. При выполнении примера память постоянно увеличивается и остается используемой даже после удаления всех переменных и вызова gc().

Реальные данные, которые у меня есть, намного больше, чем в примере, поэтому мне нужно найти обходной путь.

Мои вопросы:

Почему этот скрипт использует так много памяти?

Как заставить R освобождать выделенную память после каждого шага?

library(MNP)

nr <- 10000
draws <- 500
pieces <- 100

# Create artificial training data
trainingData <- data.frame(y = sample(c(1,2,3), nr, rep = T), x1 = sample(1:nr), x2 = sample(1:nr), x3 = sample(1:nr))

# Create artificial predictor data
predictorData <- list()
for(i in 1:pieces){
    predictorData[[i]] <- data.frame(y = NA, x1 = sample(1:nr), x2 = sample(1:nr), x3 = sample(1:nr))
}

# Estimate multinomial probit
mnp.out <- mnp(y ~ x1 + x2, trainingData, n.draws = draws)

# Predict using predictor data
predicted <- list()
for(i in 1:length(predictorData)){
    cat('|')
    mnp.pred <- predict(mnp.out, predictorData[[i]], type = 'prob')$p
    mnp.pred <- colnames(mnp.pred)[apply(mnp.pred, 1, which.max)]
    predicted[[i]] <- mnp.pred
    rm(mnp.pred)
    gc()
}

# Unite output into one string
predicted <- factor(unlist(predicted))

Вот статистика вывода после запуска скрипта:

> rm(list = ls())
> gc()
         used (Mb) gc trigger  (Mb) max used  (Mb)
Ncells 158950  8.5     407500  21.8   407500  21.8
Vcells 142001  1.1   33026373 252.0 61418067 468.6

Вот мои характеристики R:

> sessionInfo()

R version 2.13.1 (2011-07-08)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] MNP_2.6-2   MASS_7.3-14

1 Ответ

1 голос
/ 20 октября 2011

Результаты не кажутся аномальными, так как я не думаю, что это свидетельствует об утечке памяти. Я подозреваю, что вы неправильно читаете данные из gc(): правый столбец - это максимальный объем памяти, используемый при отслеживании памяти R. Если вы используете gc(reset = TRUE), то максимальный показанный объем памяти будет использоваться в LHS. т. е. 8,5 МБ и 1,1 МБ, указанные в разделе «используется».

Я подозреваю, что MNP просто потребляет много памяти на этапе прогнозирования, поэтому ничего не поделаешь, кроме разбивки данных прогнозирования на еще более мелкие куски с меньшим количеством строк.

Если у вас несколько ядер, вы можете рассмотреть возможность использования пакета foreach вместе с doSMP или doMC, поскольку это даст вам ускорение независимых вычислений и преимущество очистки ОЗУ, выделенной после каждой итерации. цикла завершен (так как он включает в себя разветвление R, которое, я полагаю, использует отдельное пространство памяти).

...