Я пытаюсь использовать H2O через R для создания нескольких моделей с использованием подмножеств одного большого массива данных (~ 10 ГБ). Данные - данные за один год, и я пытаюсь построить 51 модель (т. Е. Поезд на 1-й неделе, предсказать на 2-й неделе и т. Д.), Причем каждая неделя составляет около 1,5-2,5 млн строк с 8 переменными.R H2O - Управление памятью
Я сделал это внутри цикла, который, как я знаю, не всегда является лучшим способом в Р. Еще одна проблема, которую я обнаружил, заключалась в том, что объект H2O накапливал предыдущие объекты, поэтому я создал функцию для удаления всех из них кроме основного набора данных.
h2o.clean <- function(clust = localH2O, verbose = TRUE, vte = c()){
# Find all objects on server
keysToKill <- h2o.ls(clust)$Key
# Remove items to be excluded, if any
keysToKill <- setdiff(keysToKill, vte)
# Loop thru and remove items to be removed
for(i in keysToKill){
h2o.rm(object = clust, keys = i)
if(verbose == TRUE){
print(i);flush.console()
}
}
# Print remaining objects in cluster.
h2o.ls(clust)
}
Скрипт работает отлично на некоторое время, а затем падает - часто с жалобой о нехватке памяти и подкачки на диске.
Вот некоторые псевдо-код, чтобы описать процесс
# load h2o library
library(h2o)
# create h2o entity
localH2O = h2o.init(nthreads = 4, max_mem_size = "6g")
# load data
dat1.hex = h2o.importFile(localH2O, inFile, key = "dat1.hex")
# Start loop
for(i in 1:51){
# create test/train hex objects
train1.hex <- dat1.hex[dat1.hex$week_num == i,]
test1.hex <- dat1.hex[dat1.hex$week_num == i + 1,]
# train gbm
dat1.gbm <- h2o.gbm(y = 'click_target2', x = xVars, data = train1.hex
, nfolds = 3
, importance = T
, distribution = 'bernoulli'
, n.trees = 100
, interaction.depth = 10,
, shrinkage = 0.01
)
# calculate out of sample performance
test2.hex <- cbind.H2OParsedData(test1.hex,h2o.predict(dat1.gbm, test1.hex))
colnames(test2.hex) <- names(head(test2.hex))
gbmAuc <- h2o.performance(test2.hex$X1, test2.hex$click_target2)@model$auc
# clean h2o entity
h2o.clean(clust = localH2O, verbose = F, vte = c('dat1.hex'))
} # end loop
Мой вопрос, что, если таковые имеются, это правильный способ управления данными и памяти в автономном сущности (это НЕ работает на Hadoop или его кластер - просто большой экземпляр EC2 (~ 64 ГБ RAM + 12 процессоров)) для этого типа процесса? Должен ли я убивать и воссоздавать объект H2O после каждого цикла (это был оригинальный процесс, но чтение данных из файла каждый раз добавляло ~ 10 минут на итерацию)? Есть ли правильный способ сбора мусора или выпуска памяти после каждого цикла?
Любые предложения будут оценены.
Вы можете удалить все, что хотите, по ключу: 'h2o.rm (localH2O," keyDataWhichIWantDelete ")' –