保存一个非常大的R数据帧相当快



由于标记了一个已经很大的文本数据集,我有一个非常大的R数据帧(10G+,100mil+行(。当我尝试使用saveRDS保存df时:

saveRDS(dfname, file='dfname.rds', compress=F)

(设置compress=F,希望以某种方式节省一点时间(这需要很多小时,但保存仍然没有完成。

有没有办法在不花这么多时间的情况下节省R中的巨大DF?

我对评论中提到的方法进行了一个简单的基准测试,当数据未压缩时,data.table::fwrite领先(但生成的csv文件很大(,然后是arrow::write_parquet,然后使用data.table::fwrite压缩csv.gz,最后是saveRDS

library(readr)
library(data.table)
library(arrow)
#> 
#> Attaching package: 'arrow'
#> The following object is masked from 'package:utils':
#> 
#>     timestamp
library(bench)
large_table <- as.data.frame(matrix(rnorm(1e7), ncol = 1e4))
test_saveRDS <- function(large_table) {
saveRDS(large_table, "test.RDS")
return(TRUE)
}
test_fwrite_uncomp <- function(large_table) {
data.table::fwrite(large_table, "test_dt.csv")
return(TRUE)
}
test_fwrite <- function(large_table) {
data.table::fwrite(large_table, "test_dt.csv.gz")
return(TRUE)
}
test_write_parquet <- function(large_table) {
arrow::write_parquet(large_table, "test.parquet")
return(TRUE)
}
bench::mark(
test_saveRDS(large_table),
test_fwrite(large_table),
test_fwrite_uncomp(large_table),
test_write_parquet(large_table)
)
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
#> # A tibble: 4 × 6
#>   expression                           min   median `itr/sec` mem_alloc `gc/sec`
#>   <bch:expr>                      <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl>
#> 1 test_saveRDS(large_table)          3.68s    3.68s     0.271    8.63KB     0   
#> 2 test_fwrite(large_table)           2.95s    2.95s     0.339  211.97KB     0   
#> 3 test_fwrite_uncomp(large_table)  656.3ms  656.3ms     1.52       88KB     0   
#> 4 test_write_parquet(large_table)    1.52s    1.52s     0.659    6.47MB     2.64

saveRDS使用最少的内存,很难。

最新更新