R занимает виртуальную память полностью - PullRequest
0 голосов
/ 29 марта 2020

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

Код (упрощенный) выглядит как


 lapply(foNames, # these are just folder names like ["~/datastes/xyz","~/datastes/xyy"]
        function(foName){
     Filepath <- paste(foName,"somefile,rds",sep="")
     CleanDataObject <- readRDS(Filepath) # reads the data

     cl <- makeCluster(CONF$CORES2USE) # spins up a cluster (it does not matter if I use the cluster or not. The problem is intependent imho)

     mclapply(c(1:noOfDataSets2Generate),function(x,CleanDataObject){
                                            bootstrapper(CleanDataObject)
                                         },CleanDataObject)
     stopCluster(cl)
 })

Функция bootstrap просто производит выборку данных и сохраняет выбранные данные в диск.

bootstrapper <- function(CleanDataObject){

   newCPADataObject <- sample(CleanDataObject)
   newCPADataObject$sha1 <- digest::sha1(newCPADataObject, algo="sha1")

   saveRDS(newCPADataObject, paste(newCPADataObject$sha1 ,".rds", sep = "") )

   return(newCPADataObject)
}

Я не понимаю, как это теперь может накопить более 60 ГБ оперативной памяти. Код сильно упрощен, но imho нет ничего более проблемного c. Я могу вставить больше деталей кода, если это необходимо.

Как R удается успешно поглотить мою память, даже если я уже переписал программное обеспечение для хранения сгенерированного объекта на диске?

1 Ответ

0 голосов
/ 29 марта 2020

У меня была такая проблема с петлями в прошлом. Сложнее обращаться по функциям и применять.

Но то, что я сделал, для решения проблемы использует две вещи:

В каждой функции, которая генерирует временные файлы, используйте rm(file-name), чтобы удалить временный файл, а затем выполните gc(), который вызывает сборку мусора перед выходом из функций. Это немного замедлит процесс, но уменьшит нагрузку на память. Таким образом, каждая итерация применения будет очищена перед переходом к следующему шагу. Возможно, вам придется go вернуться к вашей первой функции во вложенных функциях, чтобы выполнить sh хорошо. Требуются эксперименты, чтобы выяснить, где создается резервная копия системы.

Я считаю, что это особенно необходимо, если вы используете ЛЮБЫЕ методы, вызываемые из пакетов, построенных на r Java, это чрезвычайно расточительно ресурсов и R не имеет способа запустить сборку мусора в куче Java, и большинство авторов пакетов java, похоже, не учитывают необходимость сбора в своих методах.

...