如何有效地保存和加载大列表

Posted

技术标签:

【中文标题】如何有效地保存和加载大列表【英文标题】: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,我更新了我的问题。 【参考方案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

【讨论】:

以上是关于如何有效地保存和加载大列表的主要内容,如果未能解决你的问题,请参考以下文章

python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战

从大型元组/行列表中有效地构建 Pandas DataFrame

从大型元组/行列表中有效地构建 Pandas DataFrame

如何使用 Core Data 有效地保存 UI/主线程中所做的更改?

如何更好地在 c# (asp.net) 和 SQL Server 上保存和加载图片?

如何通过索引从一个非常大的列表中有效地删除元素?