图像存储之 Sqlite/文件存储? Cgo/PureGo? 谁更快
最近有一批图片资源需要本地存储,但是看到密密麻麻的文件夹,头都麻了。想起过去图片迁移硬盘的痛苦(文件太多)。所以在想如果我写在 sqlite 里面,那效果怎么样呢? 于是马不停蹄的,写了一个脚本,把图片资源导入了sqlite4file.db
。表结构也很简单
type Entity struct {
Id uint64 `gorm:"primaryKey;column:id;autoIncrement;not null;" json:"id"` // 主键
Name string `gorm:"column:name;index;type:varchar(256);not null;" json:"name"` //
Type string `gorm:"column:assert_type;index;type:varchar(64);not null;" json:"type"` //
Data []byte `gorm:"column:content;type:BLOB;" json:"data"` // 内容
CreatedAt time.Time `gorm:"column:created_at;index;autoCreateTime;" json:"createdAt"` //
UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime;" json:"updatedAt"`
}
当然写进去还是要测一测的,如果性能暴跌,或者文件变得巨大无比,就得不偿失了。
首先是体积对比
我们一共又7.4w的文件
空间上的对比,五五开吧。
我们在测一下图片查看,这里写了个api查看。
中图gin + gorm + sqlite(cgo)
中图gin c.file(path) 调用
中图gin + gorm + sqlite (PureGo)
这个场景下可以看到纯go版本的sqilte不但比文件快,而且比cgo版本的sqlite还要快
接下来再试一下大图
大图gin + gorm + sqlite(cgo)
大图gin c.file(path) 调用
大图gin + gorm + sqlite (PureGo)
这个场景下可以看到 硬盘读文件,竟然又变得远超两个sqlite。因为qps均没有超过之前的中图,所以可以认为有其他方面的性能瓶颈。从测试结果上看。很有可能是使用如此大图,在高频读写的场景下,sqlite可能出现了io瓶颈,但是直接读源文件会好一些。(猜测)当然过程中也看了cpu使用率,sqlite的场景并没有比纯文件的高。但是相差不大。所以应该还是又io方面的瓶颈。
当然因为这个场景都是后续本机操作,所以sqlite对我来说也是一个不错的选择。
网上主流大多不推荐用mysql存储图片,牵扯到多次网络传输的开销。但是我的场景以本地为主,sqlite 和主程序都在同一个宿主机。并且在小图情况下,还有一点点读取优势,所以综合来说也是一个不错的选择。
当然了,sqlite每次完整的读取出文件可能相比较其他还是有一些压力,但文件平均都不是特别大(都是最大也就几MB)。所以也是一种不错的选择,方便以后迁移的时候,直接把sqlite复制以下就。
本作品采用《CC 协议》,转载必须注明作者和本文链接
SQLite
换用不同的page_size
试试?(默认 4KB/页,换成 16KB 试试?)可能大文件,SQLite 要额外找其他页的次数过多了?
:joy: 我最近也打算,用sqlite来进行,存储图片和资料,方便转移,我打算直接存入base64的图片