【问题标题】:Grow a ffdf data frame on disk gradually逐渐在磁盘上增长一个 ffdf 数据帧
【发布时间】:2015-08-30 08:19:00
【问题描述】:

来自 save.ffdf 的文档:

使用‘save.ffdf’自动设置‘ff’的‘finalizer’ 向量到“关闭”。这意味着数据将保留在 删除对象或关闭 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)

有人可以帮忙吗?

【问题讨论】:

    标签: r ff ffbase


    【解决方案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 中我们正在修复这个问题

    【讨论】:

    • 在最后一行中,save.ffdf 是覆盖所有现有向量,还是只是在~/Desktop/iris 文件夹中添加一个新向量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2014-04-08
    • 2014-02-17
    • 2023-03-20
    • 1970-01-01
    • 2016-09-17
    相关资源
    最近更新 更多