【问题标题】:ff package in R: how to move data from one drive to another, and change filenamesR中的ff包:如何将数据从一个驱动器移动到另一个驱动器,并更改文件名
【发布时间】:2013-07-04 07:52:27
【问题描述】:

我正在集中精力使用令人惊叹的 ff 和 ffbase 包。 由于一些技术细节,我必须在我的 C: 驱动器和我的 R 会话中工作。完成后,我将生成的文件移动到我的 P: 驱动器(在 Windows 中使用剪切/粘贴,而不是使用 ff)。

问题是当我加载 ffdf 对象时:

load.ffdf("data") 

我得到错误:

Error: file.access(filename, 0) == 0 is not TRUE

这没关系,因为没有人告诉 ffdf 对象它被移动了,但是尝试:

filename(data$x) <- "path/data_ff/x.ff"

pattern(data) <- "./data_ff/"

没有帮助,给出错误:

Error in `filename<-.ff`(`*tmp*`, value = filename) : 
ff file rename from 'C:/DATA/data_ff/id.ff' to 'P:/DATA_C/data_ff/e84282d4fb8.ff' failed. 

有没有办法将文件新位置的路径“更改”为 ffdf 对象? 谢谢 !!

【问题讨论】:

    标签: r ff


    【解决方案1】:

    如果您想在之后“更正”您的文件名,您可以使用:

    physical(x)$filename <- "newfilename"
    

    例如:

    > a <- ff(1:20, vmode="integer", filename="./a.ff")
    > saveRDS(a, "a.RDS")
    > rm(a)
    > file.rename("./a.ff", "./b.ff")
    [1] TRUE
    > b <- readRDS("a.RDS")
    > b
    ff (deleted) integer length=20 (20)
    > physical(b)$filename <- "./b.ff"
    > b[]
    opening ff ./b.ff
     [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
    

    在第一个会话中使用filename() 当然会更容易。您还可以查看 ffbase 包中的 save.ffdf 和相应的 load.ffdf 函数,这使得这更加简单。

    加法

    要重命名ffdf 中所有列的文件名,您可以使用以下函数:

    redir <- function(ff, newdir) {
      for (x in physical(b)) {
        fn <- basename(filename(x))
        physical(x)$filename <- file.path(newdir, fn)
      }
      return (ff)
    }
    

    【讨论】:

    • 是的,Jan,这是正确的并且有效,谢谢。但问题是移动 ffdf 中包含的所有“列”矢量文件。当然可以创建一个函数来做到这一点,但最好有一个简单的物理(ffdf)$filename
    • @MiguelVazq 我添加了一个重命名所有列的文件名的函数。
    • 感谢您的功能。我对其进行了一些修改,以获得我需要的正确行为。这是函数:redir
    【解决方案2】:

    你也可以使用ff:::clone()

    R> foo <- ff(1:20, vmode = "integer")
    R> foo
    ff (open) integer length=20 (20)
     [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]      [13] [14] [15] [16] [17] [18] [19]
       1    2    3    4    5    6    7    8    :   13   14   15   16   17   18   19
    [20]
      20
    R> physical(foo)$filename
    [1] "/vol/fftmp/ff69be3e90e728.ff"
    R> bar <- clone(foo, pattern = "~/")
    R> bar
    ff (open) integer length=20 (20)
     [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]      [13] [14] [15] [16] [17] [18] [19]
       1    2    3    4    5    6    7    8    :   13   14   15   16   17   18   19
    [20]
      20
    R> physical(bar)$filename
    [1] "/home/ubuntu/69be5ec0cf98.ff"
    

    根据我通过简要浏览save.ffdfload.ffdf 的代码了解到的情况,这些函数会在您保存/加载时为您执行此操作。

    【讨论】:

    • clone 创建 ff-vector 的副本; filename 采取行动。如果您在同一个磁盘上进行移动/复制,则移动速度会快得多(可能取决于操作系统)。在 OP 的情况下,移动/复制在不同磁盘之间,差异可能可以忽略不计。
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多