GridFS不提供文件级压缩,需应用层手动压缩;删除后空间不释放是WiredTiger设计所致,唯一彻底回收方式是导出→清空→重建。
GridFS 本身不提供文件级压缩功能,所谓“压缩大文件”,实际是指两件事:一是减少上传前的文件体积(应用层压缩),二是回收删除后残留的磁盘空间(存储层空间回收)。两者完全无关,但常被混为一谈。
GridFS 不会对内容自动压缩,它只是把输入流原样切块存进 fs.chunks。想减小存储体积,必须在写入前手动压缩。
fs.put(gzip.compress(file_bytes), filename="report.json.gz", metadata={"original_name": "report.json"})
java.util.zip.GZIPOutputStream 包裹 InputStream 后传给 GridFSInputFile
metadata 或文件名中记录原始格式,否则读取时无法正确解压执行 db.runCommand({compact: "fs.chunks"}) 后 du -sh 显示的磁盘占用几乎不变——这不是命令没生效,而是 WiredTiger 的设计使然。
compact 只重排内部页、合并空闲 slot,不触发文件系统级空间归还fs.chunks 文档极小(默认 256KB/chunk),大量删除后留下的是细碎空洞,compact 效率远低于业务集合WiredTiger 引擎下,唯一能降低 .wt 文件物理大小的方式是彻底重建数据文件。
mongodump --gzip --db your_db --collection fs.files --collection fs.chunks -o /backup/
fs.*.wt 文件(⚠️仅限维护窗口,确认无其他进程访问)mongorestore --gzip /backup/ 导入——此时生成全新、无碎片的 .wt 文件db.adminCommand({compactServer: true}) + 文件系统级 fstrim(仅限 SSD + XFS/ext4 启用 discard 挂载选项)最易被忽略的一点:GridFS 删除后空间不释放,不是运维疏忽,而是 WiredTiger 为保障写入吞吐和崩溃恢复能力做的主动取舍。日常应盯住 db.fs.chunks.stats().storageSize / db.fs.chunks.stats().size 比值,一旦超过 2.0,说明碎片已严重,该安排重建了。
小米路由器3G怎么恢复出厂设置(小米路由器3G该如何恢复出厂设置)
小米路由器3g和4a千兆版哪个好(小米路由器3g和4a千兆版对比区别)
Sensor Tower:ChatGPT全球份额跌破50%,Gemini与Claude加速追赶
OpenAI提速狂飙16倍!GPT-5.6多智能体V2上线,741轮怪物对话1秒打开
“十五五”时期 煤矿危险繁重岗位将由机器人替代
waytouniverse/ppt-generator:从 Markdown 大纲生成风格统一的 PPT 图片