压缩RData以存储至SQLite数据库的技术问询
R数据压缩存储到SQLite的问题解答
问题测试代码
你当前的测试代码对比了两种存储方式的体积差异:
# 创建一个大数据对象 carsList <- list(rep(cars,100)) # 直接序列化后转字符串的体积 object.size(paste(serialize(carsList, connection = NULL), collapse = "")) # 输出:168456 bytes # 保存为RData再读取原始字节转字符串的体积 saveTempFile <- tempfile() save(carsList, file = saveTempFile) object.size(paste(readBin(saveTempFile, what = "raw", n=1e7), collapse = "")) # 输出:1936 bytes
问题解答
1. 是否存在进一步缩小数据体积的方法?
- 提升
save的压缩级别:save默认使用gzip压缩,通过指定compression_level = 9(最高级别)可以获得更好的压缩效果:
save(carsList, file = saveTempFile, compression_level = 9)
- 更换更高压缩比的算法:除了gzip,
save支持xz和bzip2压缩算法,其中xz的压缩比通常最高,适合对体积要求优先的场景(代价是压缩/解压速度稍慢):
# 使用xz最高压缩 save(carsList, file = saveTempFile, compress = "xz", compression_level = 9) # 使用bzip2压缩 save(carsList, file = saveTempFile, compress = "bzip2")
- 针对数据类型定制优化:如果数据是数值型矩阵、数据框这类结构化数据,可以尝试用更紧凑的存储格式,比如用
bit64包处理大整数,ff包处理超大数据集,但这类方法会增加代码复杂度,适合数据量极大的场景。
2. 是否可以无需先保存到文件就能生成相同的对象?
完全可以,通过rawConnection在内存中直接生成压缩后的raw对象,不需要临时文件:
# 内存中完成压缩,生成raw类型的压缩数据 con <- rawConnection(raw(0), "w") save(carsList, file = con, compress = "xz", compression_level = 9) compressed_raw <- rawConnectionValue(con) close(con) # 查看压缩后的体积(注意:直接存raw到SQLite的BLOB字段即可,无需转字符串,转字符串会额外增加体积) object.size(compressed_raw)
如果需要从内存中的raw恢复数据,也可以直接操作:
# 从内存raw恢复数据 con <- rawConnection(compressed_raw) loaded_name <- load(con) close(con) carsList_loaded <- get(loaded_name)
注意:SQLite支持直接存储BLOB类型数据,建议直接将
compressed_raw存入BLOB字段,而不是转成字符串,这样能避免不必要的体积开销。
内容的提问来源于stack exchange,提问作者questions4968
相关产品推荐
相关产品推荐

