如何有效地保存和加载大列表
Posted
技术标签:
【中文标题】如何有效地保存和加载大列表【英文标题】:How can I efficiently save and load a big list 【发布时间】:2018-07-31 17:53:11 【问题描述】:免责声明:
你们中的许多人都指出了一个重复的帖子,我知道这一点,但我认为这不是一个公平的重复,因为数据框和列表的某些保存/加载方式可能不同。例如,fst
和 feather
包适用于数据帧,但不适用于列表。
我的问题是针对列表的。
我有一个约 50M 的元素列表,我想将它保存到一个文件中,以便在不同的 R 会话之间共享它。
我知道在 R 中保存的本地方式(save
、save.image
、saveRDS
)。我的观点是:你还会在大规模数据上使用这些函数吗?
保存和读取它的最快方法是什么? (任何 R 可读格式都可以)。
【问题讨论】:
@MLavoie 但它适用于 data.tables 而不是列表,不是吗? @MLavoie OP 想要保存一个列表。我会选择基本 RDS 或花哨的 fst 解决方案。 堆栈上没有一篇关于将列表保存到文件的帖子。也许你可以尝试提供一点帮助,而不是给所有的减号。 @GeraldT,抱歉我读得太快了你的问题 :-) @Moody_Mudskipper,我更新了我的问题。 【参考方案1】:经过一些研究,似乎没有真正的替代基础 saveRDS
函数,并且处理大型列表的包也不多。
将列表保存为 data.table/data.frame 的列不适用包fst
和feather
,它适用包裹data.table
。然而,当它读回来时,它变成了一个强制使用strsplit
或其最快的替代str_split
的字符。
我能找到的唯一一个直接关注列表的包是rlist
,但是与基本函数saveRDS
、readRDS
相比,它并不能加快从文件读取或写入文件的速度。
基准测试:
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/主线程中所做的更改?