Постепенно увеличивайте фрейм данных на диске
Из документации save.ffdf:
Использование 'save.ffdf' автоматически устанавливает для 'финализатора' векторов 'ff' значение 'close' '. Это означает, что данные будут сохранены на диске при удалении объекта или при закрытии 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.
В настоящее время преобразование неэффективно для добавления нового столбца, поскольку оно копирует весь фрейм данных (то есть семантику R). Это потому, что преобразование может быть временным результатом, и вы не будете изменять исходные данные.
В ffbase2 мы исправляем эту проблему