Постепенно увеличивайте фрейм данных ffdf на диске

Из документации save.ffdf:

Использование «save.ffdf» автоматически устанавливает «финализатор» векторов «ff» на «закрыть». Это означает, что данные будут сохранены на диске при удалении объекта или закрытии сеансов R. Данные можно удалить либо с помощью «удалить», либо удалив каталог, в котором был сохранен объект («каталог»).

Я хочу начать с небольшого кадра данных 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)

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


person qed    schedule 14.06.2015    source источник


Ответы (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.

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

В ffbase2 мы исправляем эту проблему

person edwindj    schedule 15.06.2015
comment
В последней строке save.ffdf перезаписывает все существующие векторы или просто добавляет новый в папку ~/Desktop/iris? - person qed; 15.06.2015