освобождение памяти в R

в R я пытаюсь объединить и преобразовать несколько наборов данных timeseries в xts из http://www.truefx.com/?page=downloads тем не менее, файлы большие и там много файлов, так что это вызывает у меня проблемы на моем ноутбуке. Они хранятся в виде файла csv, которые были сжаты в виде zip-файла.

загрузка и распаковка их достаточно проста (хотя занимает много места на жестком диске).

загрузка файлов 350MB+ в течение одного месяца стоимость данных в R достаточно прямолинейна с новым на data.table пакета.

некоторые преобразования datatable сделаны (внутри функции) так, что метки времени можно прочитать легко и средний столбец будет произведен. Затем datatable сохраняется как файл RData на жестком диске, и все ссылки на объект datatable удаляются из рабочей области, а gc() запускается после удаления...однако, глядя на сеанс R в моей деятельности Монитор (запуск с Mac) ... он по-прежнему выглядит так, как будто он занимает почти 1 ГБ оперативной памяти...и все кажется немного запаздывающим...Я намеревался загрузить несколько лет csv-файлов одновременно, преобразовать их в пригодные для использования datatables, объединить их, а затем создать один объект xts, который кажется невозможным, если только один месяц использует 1 ГБ ОЗУ.

Я знаю, что могу последовательно загружать каждый файл, конвертировать его, сохранять его, выключать R и повторять, пока у меня не будет куча файлов RData, которые я могу просто загрузить и bind, но надеялся, что может быть более эффективный способ сделать это, чтобы после удаления всех ссылок на datatable вы вернулись не "нормальным" или на уровнях запуска использования ОЗУ. Есть ли лучшие способы очистки памяти, чем gc()? Любые предложения были бы весьма признательны.

1 ответов


в моем проекте мне пришлось иметь дело со многими большими файлами. Я организовал процедуру по следующим принципам:--5-->

  1. изолировать голодные по памяти операции в отдельных R скрипты.
  2. запустите каждый скрипт в новом процессе, который будет уничтожен после выполнения. Таким образом, система возвращает использованную память.
  3. передать параметры скриптам через текстовый файл.

Рассмотрим пример игрушки ниже.

сведения поколение:

setwd("/path/to")
write.table(matrix(1:5e7, ncol=10), "temp.csv") # 465.2 Mb file

раб.R - потребление памяти часть

setwd("/path/to")
library(data.table)

# simple processing
f <- function(dt){
  dt <- dt[1:nrow(dt),]
  dt[,new.row:=1]
  return (dt)
}

# reads parameters from file
csv <- read.table("io.csv")
infile  <- as.character(csv[1,1])
outfile <- as.character(csv[2,1])

# memory-hungry operations
dt <- as.data.table(read.csv(infile))
dt <- f(dt)
write.table(dt, outfile)

мастер.R - выполняет рабы в отдельных процессах

setwd("/path/to")

# 3 files processing
for(i in 1:3){
  # sets iteration-specific parameters
  csv <- c("temp.csv", paste("temp", i, ".csv", sep=""))
  write.table(csv, "io.csv")

  # executes slave process
  system("R -f slave.R")
}