我目前有一个非常大的数组(500个元素,每个元素有一个1000乘20的矩阵)。我一直在使用saveRDS
来保存对象。但是,它一直需要很长时间才能完成。我想知道save()
是否更快,或者每个选项中是否有选项可以更快地保存?感谢。
答案 0 :(得分:2)
你总是可以在消息来源中留意:
saveRDS()
function (object, file = "", ascii = FALSE, version = NULL, compress = TRUE,
refhook = NULL) {}
...
.Internal(serializeToConn(object, con, ascii, version, refhook))
}
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))
}
OR
给它一个基准(List假设它是一个矩阵对象列表):
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_level
中的save()
和level
gzcon()
中的saveRDS()
设置用于compress
OpenSSL 1.0.2k 26 Jan 2017
built on: reproducible build, date unspecified
platform: darwin64-x86_64-cc
options: bn(64,64) rc4(ptr,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: cc -I. -I.. -I../include -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -arch x86_64 -O3 -DL_ENDIAN -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/local/php5/ssl"
,以查看更改或删除压缩是否有帮助。