Объект ffdf потребляет дополнительную оперативную память (в ГБ)

Решил проверить ключевое преимущество пакета ff - минимальное выделение оперативной памяти (характеристики ПК: i5, RAM 8Gb, Win7 64 бит, Rstudio).

Согласно описанию пакета, мы можем манипулировать физическими объектами (файлами) так же, как и виртуальными, как если бы они были размещены в оперативной памяти. Таким образом, фактическое использование оперативной памяти значительно снижается (с Гб до Кб). Код, который я использовал, выглядит следующим образом:

library(ff)
library(ffbase)

setwd("D:/My_package/Personal/R/reading")
x<-cbind(rnorm(1:100000000),rnorm(1:100000000),1:100000000)
system.time(write.csv2(x,"test.csv",row.names=FALSE))

system.time(x <- read.csv2.ffdf(file="test.csv", header=TRUE,       first.rows=100000, next.rows=100000000,levels=NULL))         
print(object.size(x)/1024/1024)
print(class(x))

Фактический размер файла составляет 4,5 Гб, реально используемая оперативная память варьируется таким образом (по Диспетчеру задач): 2,92 -> верхний предел (~8 Гб) -> 5,25 Гб. Размер объекта (по object.size()) составляет около 12 кб.

Меня беспокоит дополнительное выделение оперативной памяти (~ 2,3 ГБ). По описанию пакета он должен был увеличиться всего на 12 кб. Я не использую никаких символов.

Может быть, я что-то пропустил в пакете ff.


person Dimon D.    schedule 03.02.2016    source источник


Ответы (1)


Что ж, я нашел решение, позволяющее исключить использование дополнительной оперативной памяти.

В первую очередь необходимо обратить внимание на такие аргументы как first.rows и next.rows метода read.table.ffdf в пакете ff.

Первый аргумент ("first.rows") определяет начальный фрагмент в количестве строк и определяет начальное выделение памяти. Я использовал значение по умолчанию (1000 строк).

Выделение дополнительной памяти является предметом второго аргумента («next.rows»). Если вы хотите иметь объект ffdf без дополнительных выделений оперативной памяти (в моем случае - в Гб), то вам нужно выбрать такое количество строк для следующего чанка, чтобы размер чанка не превышал значение 'getOption("ffbatchbytes ")'.

В моем случае я использовал «first.rows=1000» и «next.rows=1000», а общий объем ОЗУ варьировался до 1 МБ в диспетчере задач. Увеличение 'next.rows' до 10000 привело к увеличению оперативной памяти на 8-9 Мб.

Так что эти аргументы подлежат вашим экспериментам, чтобы подобрать наилучшую пропорцию.

Кроме того, вы должны иметь в виду, что увеличение «next.rows» повлияет на время обработки для создания объекта ffdf (несколько прогонов):

«first.rows=1000» и «next.rows=1000» составляют около 1500 секунд. (ОЗУ ~ 1 Мб) 'first.rows=1000' и 'next.rows=10000' составляет около 230 секунд. (ОЗУ ~ 9Мб)

person Dimon D.    schedule 04.02.2016