【问题标题】:How can I efficiently save and load a big list如何有效地保存和加载大列表
【发布时间】:2018-07-31 17:53:11
【问题描述】:

免责声明: 你们中的许多人都指出了一个重复的帖子,我知道这一点,但我认为这不是一个公平的重复,因为数据框和列表的某些保存/加载方式可能不同。例如,fstfeather 包适用于数据帧,但不适用于列表。

我的问题是针对列表的。

我有一个约 50M 的元素列表,我想将它保存到一个文件中,以便在不同的 R 会话之间共享它。

我知道在 R 中保存的本地方式(savesave.imagesaveRDS)。我的观点是:你还会在大规模数据上使用这些函数吗?

保存和读取它的最快方法是什么? (任何 R 可读格式都可以)。

【问题讨论】:

  • @MLavoie 但它适用于 data.tables 而不是列表,不是吗?
  • @MLavoie OP 想要保存一个列表。我会选择基本 RDS 或花哨的 fst 解决方案。
  • 堆栈上没有一篇关于将列表保存到文件的帖子。也许你可以尝试提供一点帮助,而不是给所有的减号。
  • @GeraldT,抱歉我读得太快了你的问题 :-)
  • @Moody_Mudskipper,我更新了我的问题。

标签: r list save bigdata


【解决方案1】:

经过一些研究,似乎没有真正的替代基础 saveRDS 函数,并且处理大型列表的包也不多。

将列表保存为 data.table/data.frame 的列不适用fstfeather,它适用包裹data.table。然而,当它读回来时,它变成了一个强制使用strsplit 或其最快的替代str_split 的字符。

我能找到的唯一一个直接关注列表的包是rlist,但是与基本函数saveRDSreadRDS 相比,它并不能加快从文件读取或写入文件的速度。

基准测试:

l <- lapply(1:10000000, function (x) {rnorm(sample(1:5, size = 1, replace = T))} )
dt_l <- data.table(l = as.list(l))

microbenchmark::microbenchmark(times = 5L,
  "data.table"     =  { fwrite(dt_l, "dt_l.csv")
                        dt_l   <- fread("dt_l.csv", sep = ",", sep2 = "\\|")
                        l_load <- str_split(dt_l$l, "\\|")
                      },

  "rlist"          =  { list.save(l, "l.rds")
                        l_load <- list.load("l.rds")
                      },

  "RDS_base"       =  { saveRDS(l, "l.rds")
                        l_load <- readRDS("l.rds")                        
                      }

)

Unit: seconds
          expr      min       lq     mean   median       uq      max neval
    data.table 18.30548 18.67964 18.98801 19.17744 19.19791 19.57956     5
 RDS_list.save 16.80936 16.81615 16.86114 16.84012 16.91770 16.92236     5
      RDS_base 16.90403 17.23784 18.62475 19.48391 19.60365 19.89431     5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2012-02-01
    相关资源
    最近更新 更多