由于标记了一个已经很大的文本数据集,我有一个非常大的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
使用最少的内存,很难。