событие пожара, основанное на использовании памяти в R - PullRequest
5 голосов
/ 04 октября 2011

Мне было интересно, каким будет хороший способ вызвать событие, основанное на использовании памяти в R.Скажем, я объединяю кучу файлов в один мастер-файл, но размер всего мастер-файла может быть слишком большим для хранения в памяти.Когда я подхожу к пределу памяти, я хотел бы сохранить свой текущий мастер-файл и освободить память.

master <- NULL
partnum <- 1
threshold  <- 0.8
filelist <- list.files(mypath)

for (filename in filelist) 
{
   filedata <- read.csv(filename)
   if (is.null(master)) master <- filedata
   else master <- rbind(master,filedata)
   rm(filedata)

   # test for memory usage here
   # if (usedMemory > availableMemory * threshold)
   # then do the following else go to top of loop

   save(master,file=paste(mypath,partnum,"rData",sep="."))
   master <- NULL
   partnum <- partnum + 1
}

То, что я хотел бы сделать, - это рассчитать объем памяти, доступный на машине.Таким образом, событие будет запускаться динамически в зависимости от текущего использования компьютера.Скажем, когда сценарий запущен, на компьютере доступно 10 ГБ, поэтому выполняйте очистку при использовании 8 ГБ.Однако, скажем, в середине выполнения другой пользователь запускает программу, которая потребляет 5 ГБ, тогда я бы хотел очистить, когда используется 4 ГБ.

> x <- 1:10^9
> memory.size()
[1] 3832.26
> memory.limit()
[1] 16381
> gc()
            used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells    164953    8.9     350000   18.7    350000   18.7
Vcells 500150216 3815.9  669246830 5106.0 550150069 4197.4

На данный момент на моей машине у меня есть только 10 ГБ, доступные из-за других процессовпотребляет 2 ГБ

1 Ответ

2 голосов
/ 04 октября 2011

Возможно, вы захотите попробовать memory.size.Может быть что-то вроде этого:

# Are we using more than 1 GB?
if (memory.size() > 1000) {
  # Force a garbage collect and check again
  gc()
  if (memory.size() > 1000) {
    # free up memory...
  }
}

Вызов memory.size не производит сборку мусора, поэтому вы всегда можете сделать это перед вызовом или условно, как в примере выше (сборка мусора может занять некоторое время).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...