如何在R中用fwrite生成bzip2压缩CSV,或先存CSV再转压缩?
关于用data.table::fwrite生成bzip2压缩CSV的解决方案
直接用fwrite生成bzip2的可能性
data.table的fwrite目前不支持直接输出bzip2压缩格式,它原生仅支持gzip和zip压缩(通过compression参数指定),因此直接写入.csv.bzip2后缀的文件不会触发压缩,只会生成普通CSV。
替代方案:先存普通CSV再压缩
利用fwrite的高速写入能力先保存未压缩CSV,再通过两种方式转为bzip2格式:
方法1:使用R内置工具压缩
library(data.table) # 生成测试数据 df <- data.frame(A = rnorm(100000), B = rnorm(100000), C = rnorm(100000)) # 用fwrite快速保存未压缩CSV fwrite(df, "temp_uncompressed.csv") # 通过文件连接将普通CSV转为bzip2压缩格式 input_con <- file("temp_uncompressed.csv", "r") output_con <- bzfile("df.csv.bzip2", "w") writeLines(readLines(input_con), output_con) # 关闭连接并删除临时文件 close(input_con) close(output_con) file.remove("temp_uncompressed.csv")
方法2:调用系统bzip2命令(推荐,速度更快)
Linux/macOS默认自带bzip2命令,Windows需确保命令可用(如安装Git Bash或Rtools并添加到环境变量):
library(data.table) # 生成测试数据并快速保存未压缩CSV df <- data.frame(A = rnorm(100000), B = rnorm(100000), C = rnorm(100000)) fwrite(df, "temp_uncompressed.csv") # 调用系统命令压缩,-f参数强制覆盖已有文件 system("bzip2 -f temp_uncompressed.csv") # 按需重命名压缩后的文件(默认会生成temp_uncompressed.csv.bz2) file.rename("temp_uncompressed.csv.bz2", "df.csv.bzip2")
这种方式结合了fwrite的写入速度优势和系统压缩工具的高效性,整体处理大文件的速度会远优于原生write.csv + bzfile的组合。
内容的提问来源于stack exchange,提问作者jruf003
相关产品推荐
相关产品推荐

