3

从 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

事实证明,当我删除 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)

有人可以帮忙吗?

4

1 回答 1

1

ffffbase提供内存不足的 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 我们正在修复这个问题

于 2015-06-15T07:27:07.527 回答