как сделать арифметические операции в объекте ffdf пакета ff

У меня есть скрипт, создающий объект ffdf:

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=1000, next.rows=10000,levels=NULL)) 

Теперь я хочу увеличить столбец №1 x на 5.
Чтобы выполнить такую ​​операцию, я использую метод add() пакета ff:

add(x[,1],5)

Вывод в порядке (столбец № 1 увеличивается на 5). Но дополнительное выделение ОЗУ катастрофично - похоже, что я работаю со всем фреймом данных в ОЗУ, а не с объектом ffdf.

Итак, мой вопрос о правильном способе работы с элементами объекта ffdf без резкого выделения дополнительной оперативной памяти.


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


Ответы (2)


Вы можете просто сделать следующее

require(ffbase)

x <- ff(1:10)
y <- x + 5
x
y

ffbase разработала все арифметические операции, см. help("+.ff_vector")

person Community    schedule 12.02.2016
comment
@jwijffels: большое спасибо. Я буду уделять больше внимания этому пакету. - person Dimon D.; 12.02.2016

Я использовал метод фрагментов для выполнения арифметических вычислений без дополнительных накладных расходов на ОЗУ (см. Исходный сценарий в разделе вопросов):

chunk_size<-100
m<-numeric(chunk_size)
chunks <- chunk(x, length.out=chunk_size)

system.time(
    for(i in seq_along(chunks)){
      x[chunks[[i]],][[1]]<-x[chunks[[i]],][[1]]+5
    }
)
x

Теперь я увеличил каждый элемент столбца № 1 объекта x на 5 без значительных выделений ОЗУ.

'chunk_size' также регулирует количество чанков -> чем больше чанков используется, тем меньше накладные расходы ОЗУ. Но могут возникнуть проблемы со временем обработки.

Краткий пример и пояснения по чанкам в ffdf находятся здесь:
https://github.com/demydd/R-for-Big-Data/blob/master/09-ff.Rmd

В любом случае, было бы неплохо услышать альтернативные подходы.

person Dimon D.    schedule 05.02.2016