Почему ff по-прежнему хранит данные в оперативной памяти? - PullRequest
4 голосов
/ 18 января 2012

Используя пакет ff из R , я импортировал csv-файл в объект ffdf, но был удивлен, обнаружив, что этот объект занимает около 700 МБ оперативной памяти.Разве ff не должен хранить данные на диске, а не в оперативной памяти?Я сделал что-то неправильно?Я новичок в R. Любые советы приветствуются.Спасибо.

> training.ffdf <- read.csv.ffdf(file="c:/temp/training.csv", header=T)
> # [Edit: the csv file is conceptually a large data frame consisting
> # of heterogeneous types of data --- some integers and some character
> # strings.]
>
> # The ffdf object occupies 718MB!!!
> object.size(training.ffdf)
753193048 bytes
Warning messages:
1: In structure(.Internal(object.size(x)), class = "object_size") :
  Reached total allocation of 1535Mb: see help(memory.size)
2: In structure(.Internal(object.size(x)), class = "object_size") :
  Reached total allocation of 1535Mb: see help(memory.size)
>
> # Shouldn't biglm be able to process data in small chunks?!
> fit <- biglm(y ~ as.factor(x), data=training.ffdf)
Error: cannot allocate vector of size 18.5 Mb

Редактировать: Я последовал совету Томми, пропустил вызов object.size и посмотрел на диспетчер задач (я запускал R на машине с Windows XP с 4 ГБ ОЗУ),Я сохранил объект, закрыл R, снова открыл его и загрузил данные из файла.Проблема преобладала:

> library(ff); library(biglm)
> # At this point RGui.exe had used up 26176 KB of memory
> ffload(file="c:/temp/trainingffimg")
> # Now 701160 KB
> fit <- biglm(y ~ as.factor(x), data=training.ffdf)
Error: cannot allocate vector of size 18.5 Mb

Я также пытался

> options("ffmaxbytes" = 402653184) # default = 804782080 B ~ 767.5 MB

, но после загрузки данных RGui по-прежнему использовал более 700 МБ памяти, а регрессия biglm по-прежнему выдавала ошибку.

Ответы [ 3 ]

4 голосов
/ 14 ноября 2012

Вам нужно предоставить данные в виде кусков в biglm, понимаете? Biglm.Если вы передаете объект ffdf вместо data.frame, вы сталкиваетесь с одной из следующих двух проблем:

  1. ffdf не является data.frame, поэтому происходит нечто неопределенное
  2. функция, которую вы передали, пытается преобразовать ffdf в data.frame, например, as.data.frame (ffdf), которая легко исчерпывает вашу оперативную память, вероятно, именно это и произошло с вами.ffdf для примера того, как передать чанки из ffdf в biglm.
2 голосов
/ 18 января 2012

Пакет ff использует отображение памяти, чтобы просто загрузить части данных в память по мере необходимости.

Но кажется, что, вызывая object.size, вы фактически заставляете загружать все это в память! Вот что указывают предупреждающие сообщения ...

Так что не делайте этого ... Используйте диспетчер задач (Windows) или команду top (Linux), чтобы увидеть, сколько памяти фактически использует процесс R до и после загрузки данных.

0 голосов
/ 22 февраля 2013

У меня была такая же проблема, и я отправил вопрос, и есть возможное объяснение вашей проблемы.Когда вы читаете файл, символьные строки рассматриваются как факторы, и, если уникальных уровней много, они попадают в ОЗУ.ff, кажется, всегда загружает уровни факторов в RAM.Смотрите ответ от jwijffels на мой вопрос:

Загрузка данных в формате ffdf занимает много памяти

лучше всего, мигель.

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