在磁盘上逐渐增长一个 ffdf 数据框

Grow a ffdf data frame on disk gradually

来自 save.ffdf 的文档:

Using ‘save.ffdf’ automagically sets the ‘finalizer’s of the ‘ff’ vectors to ‘"close"’. This means that the data will be preserved on disk when the object is removed or the R sessions is closed. Data can be deleted either using ‘delete’ or by removing the directory where the object were saved (‘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

事实证明,当我删除 ffiris 时,它不会自动更新磁盘上的 ff 数据。手动保存呢?

# 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)

有人能帮忙吗?

ffffbase 提供内存不足的 R 向量,但引入了引用语义,这可能会给 R 习语带来问题。

R是一种函数式编程语言,意思是函数不改变参数和对象,而是return修改的副本。在 ffbase 中,我们以 R 方式实现功能,即 transform returns 原始 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 中解决这个问题