繁体   English   中英

逐渐在磁盘上增加ffdf数据帧

[英]Grow a ffdf data frame on disk gradually

从save.ffdf的文档:

使用'save.ffdf'自动将'ff'向量的'终结器'设置为''close''。 这意味着当删除对象或关闭R会话时,数据将保留在磁盘上。 可以使用“删除”删除数据,也可以删除保存对象的目录('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.

转换目前添加新列效率很低,因为它复制整个数据帧(即R语义)。 这是因为变换可能是一个临时结果,您不会改变原始数据。

在ffbase2中我们正在解决这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM