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

Из документации 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 мы исправляем эту проблему

Другие вопросы по тегам