gpt4 book ai didi

r - 为了在 R 中保存单个大对象,saveRDS 还是保存得更快?

转载 作者:行者123 更新时间:2023-12-05 04:05:57 25 4
gpt4 key购买 nike

我目前有一个非常大的数组(500 个元素,每个元素都有一个 1000 x 20 的矩阵)。我一直在使用 saveRDS 来保存对象。然而,这样做总是需要很长时间。我想知道 save() 是否更快,或者是否每个选项中都有选项可以更快地保存东西?谢谢。

最佳答案

您总是可以在源代码中进行一些探索:

saveRDS() :

function (object, file = "", ascii = FALSE, version = NULL, compress = TRUE, 
refhook = NULL) {}
...
.Internal(serializeToConn(object, con, ascii, version, refhook))
}

最终:https://github.com/wch/r-source/blob/2c3e0e757e81ca23c34da8dde4ff925bd9d275f0/src/main/serialize.c#L2471-L2536

save() :

function (..., list = character(), file = stop("'file' must be specified"), 
ascii = FALSE, version = NULL, envir = parent.frame(), compress = isTRUE(!ascii),
compression_level, eval.promises = TRUE, precheck = TRUE) {
...
.Internal(saveToConn(list, con, ascii, version, envir, eval.promises))
}

最终:https://github.com/wch/r-source/blob/6ac8f58c608337200f85ea47cba2abc717be6eb5/src/main/saveload.c#L1973-L2041

给它一个基准(列表假设它是一个矩阵对象列表):

library(microbenchmark)

set.seed(0)

lapply(1:500, function(i) {
matrix(sample(20*1000), nrow = 1000, ncol = 20)
}) -> matrix_list

print(str(matrix_list, list.len=5))
## List of 500
## $ : int [1:1000, 1:20] 17934 5310 7442 11456 18161 4033 17963 18887 13211 12577 ...
## $ : int [1:1000, 1:20] 2227 4212 2296 2907 6198 3005 10531 2358 9543 15374 ...
## $ : int [1:1000, 1:20] 5969 11861 11057 11933 7852 17959 14794 530 16811 17003 ...
## $ : int [1:1000, 1:20] 1073 14634 12948 16282 2087 6687 7992 7640 18482 8043 ...
## $ : int [1:1000, 1:20] 10900 8249 6059 10767 15541 17139 11663 9010 576 14900 ...
## [list output truncated]
## NULL

pryr::object_size(matrix_list)
## 40.1 MB

microbenchmark(
save = save(matrix_list, file = "/tmp/out.rda"),
saveRDS = saveRDS(matrix_list, file = "/tmp/out.rds"),
times = 5,
control = list(warmup = 2)
) -> mb

mb
## Unit: seconds
## expr min lq mean median uq max neval
## save 8.571138 8.578461 8.747248 8.650629 8.665557 9.270453 5
## saveRDS 8.647355 8.655231 9.298947 8.684998 8.772102 11.735052 5

您可以使用 compress 中的 compression_levelsave() 设置以及 level 中的 gzcon() 以在带有 saveRDS()compress 中使用,以查看更改或删除压缩是否有帮助。

关于r - 为了在 R 中保存单个大对象,saveRDS 还是保存得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50440597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com