2015-06-14 3 views
3

Из документации save.ffdf:Grow кадр FFDF данных на диске постепенно

Использование «save.ffdf» автомагически устанавливает поле «финализации-х из„FF“ векторов„„закрыть““. Это означает, что данные будут сохранены на диске , когда объект будет удален или сеансы R закрыты. Данные могут быть удалены либо с помощью «delete», либо путем удаления каталога, в котором объект был сохранен ('dir').

Я хочу начать с небольшого фрейма данных ffdf, добавить немного новых данных за раз и развить его на диске. Так что я сделал небольшой эксперимент:

# in R 
ffiris = as.ffdf(iris) 
save.ffdf(ffiris, dir = "~/Desktop/iris") 

# in bash 
ls ~/Desktop/iris/ 
## ffiris$Petal.Length.ff ffiris$Petal.Width.ff ffiris$Sepal.Length.ff ffiris$Sepal.Width.ff ffiris$Species.ff 

# in R 
# add a new column 
ffiris =transform(ffiris, new1 = rep(99, nrow(iris))) 
rm(ffiris) 

# in bash 
ls ~/Desktop/iris/ 
## ffiris$Petal.Length.ff ffiris$Petal.Width.ff ffiris$Sepal.Length.ff ffiris$Sepal.Width.ff ffiris$Species.ff 

Оказывается, она автоматически не обновляет данные Ff на диске при удалении ffiris. Как насчет сохранения вручную?

# in R 
# add a new column 
ffiris =transform(ffiris, new1 = rep(99, nrow(iris))) 
save.ffdf(ffiris, "~/Desktop/iris") 

# in bash 
ls ~/Desktop/iris/ 
## ffiris$Petal.Length.ff ffiris$Petal.Width.ff ffiris$Sepal.Length.ff ffiris$Sepal.Width.ff ffiris$Species.ff 

Хм, еще не повезло. Зачем?

Как удалить папку перед сохранением?

# in R 
ffiris = as.ffdf(iris) 
unlink("~/Desktop/iris", recursive = TRUE, force = TRUE) 
save.ffdf(ffiris, "~/Desktop/iris", overwrite = TRUE) 
ffiris =transform(ffiris, new1 = rep(99, nrow(iris))) 
unlink("~/Desktop/iris", recursive = TRUE, force = TRUE) 
save.ffdf(ffiris, "~/Desktop/iris", overwrite = TRUE) 

# in bash 
ls ~/Desktop/iris/ 
# ls: /Users/ky/Desktop/iris/: No such file or directory 

Даже незнакомец. Даже если это все работает, все равно будет ужасно неэффективно. Я ищу что-то вроде:

updateOnDisk(ffiris) 

Может ли кто-нибудь помочь?

ответ

1

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

R - функциональный язык программирования, что означает, что функции не изменяют параметры и объекты, а возвращают измененные копии. В ffbase мы реализуем функции по R-методу, то есть transform возвращает копию оригинала ffdf data.frame. Это можно увидеть, посмотрев на имена файлов:

ffiris = as.ffdf(iris) 
save.ffdf(ffiris, dir = "~/Desktop/iris") 
filename(ffiris) # show contents of ~/Desktop/iris 

ffiris =transform(ffiris, new1 = 99) # this create a copy of the whole data.frame! 
filename(ffiris) 

ffiris$new2 <- ff(rep(99, nrow(iris))) # this creates a new column, but not yet in the right directory 
filename(ffiris) 

save.ffdf(ffiris, dir="~/Desktop/iris", overwrite=TRUE) # this fixes that. 

Transform в настоящее время неэффективно, чтобы добавить новый столбец, потому что он копирует весь кадр данных (то есть R семантика). Это связано с тем, что преобразование может быть временным результатом, и вы не хотите изменять исходные данные.

В ffbase2 мы фиксируем этот вопрос

+0

В последней строке, это 'save.ffdf' перезаписать все существующие векторы, или просто добавить новый к/iris' папке' ~/Desktop? – qed

Смежные вопросы