gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:25:05 25 4
gpt4 key购买 nike

来自 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 是一种函数式编程语言,这意味着函数不会更改参数和对象,而是返回修改后的副本。在 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 中我们正在解决这个问题

关于r - 在磁盘上逐渐增长一个 ffdf 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30834967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com