怎么存储千万级别的图片文件, 在保证尽可能节省空间的前提下,还能方便读写

2020-06-03 14:06:53 +08:00
 xchaoinfo

之前的图片都是一个个小文件放在文件夹中, 这样的问题是, 需要的存储空间比较大, 图片迁移也不方便, 而且对 I/O 的消耗非常大. 目前考虑使用数据库来存储, 方案有 lmdb sqlite 请问各位 V 友, 有其他好的方案吗? 能支持多线程读写最好.

7082 次点击
所在节点    数据库
74 条回复
cco
2020-06-03 14:14:35 +08:00
Hbase 也是可以的。。
hankai17
2020-06-03 14:14:43 +08:00
小文件 io 流量大吗?
wujieyuan
2020-06-03 14:20:17 +08:00
数据库也是文件存储啊,二进制存到数据库不仅费 io 还费 cpu, 文件应该是利用率最高的存储方式了吧
Jirajine
2020-06-03 14:22:17 +08:00
minio
maemual
2020-06-03 14:23:06 +08:00
seaweedfs
msg7086
2020-06-03 14:23:14 +08:00
文件系统就是一个效率很高的数据库了。
你说的这些难道不需要同等的存储空间?不需要消耗那么多 I/O ?
reus
2020-06-03 14:25:56 +08:00
既然你会考虑 sqlite,我建议你放弃这个想法,信操作系统。
djoiwhud
2020-06-03 14:30:46 +08:00
你不考虑一下 oss 服务?我只在学生时代见过在 db 中保存图片的。
xchaoinfo
2020-06-03 14:35:41 +08:00
@hankai17 访问量不大, 准确的说, 这个图片是用于做机器学习训练用的, 并不是提供给外网服务的.
xchaoinfo
2020-06-03 14:40:38 +08:00
@wujieyuan @reus @msg7086 考虑 sqlite 是想要把图片分批保存到 sqlite 中, 这样迁移的时候, 就复制一个 sqlite 的文件就好了, 主要是为了迁移方便, 图片主要是为了做 训练使用.
xingyuc
2020-06-03 14:49:03 +08:00
按照不同分类大小创建文件夹,然后文件名是 md5,每次上传先找一下有没有一样的……
luckyrayyy
2020-06-03 14:51:04 +08:00
minio
wujieyuan
2020-06-03 14:51:51 +08:00
@xchaoinfo 文件系统已经是效率最高的存储方式了, 你说的只是小文件复制慢的问题, 这个完全可以在转移的时候批量压缩再复制, 你想把他们在运行期间就集中在一个数据库文件中, 性能损失更大
rockyou12
2020-06-03 14:54:25 +08:00
如果你方问慢,很可能是你没做好分文件夹、硬盘分区、文件命名这些,或者是你硬件遇到瓶颈。把图片放进数据来读写一般并不能提高 io……
ladypxy
2020-06-03 14:56:49 +08:00
用 zfs 开压缩啊
Mithril
2020-06-03 15:00:06 +08:00
数据库不是设计来保存二进制的。保存文件已经是最经济的办法了。
觉得零碎文件不够优化的话,你可以自己写。
直接开一个大文件,然后把你的图片顺序写进去。另外用数据库保存图片的 offset 和大小。读取的时候直接 memory map 到对应位置。
不过这样相当于你自己实现了部分文件系统的功能,可以感官上减少一定存储空间,并且用 HDD 的话可以较少碎片提高一定性能。
实际上用处不大。。。
hakono
2020-06-03 15:14:25 +08:00
各位别瞎误导 LZ,硬盘分区中的文件系统的确是高效,但对于楼主这种大量零碎文件的存储的场景,直接塞硬盘的文件系统里是非常糟糕的做法。要不然你以为各个大厂都有自己专用的小文件 FS 是为了什么,吃饱了撑的吗

之前自己开发了一个漫画管理库服务,图片做 hash,然后按照 hash 值 /ab/cd/efdghijk.jpg 的路径保存图片,才区区塞了 20w+张图片,就感觉管理维护起来是个灾难了,然后乖乖用 C 写了个最简单粗暴原始的 FileSystem,立刻性能上了 N 个台阶

LZ 不想自己写的话,可以使用开源的一些 FS
https://cloud.tencent.com/developer/news/137215
PopRain
2020-06-03 15:21:19 +08:00
看文件大小了,不是特别小的文件(小于 4K), 还是放在目录里面高效; 放数据库,备份时、万一文件损坏你会哭死。。。。
realpg
2020-06-03 15:41:45 +08:00
如果文件确实很小,建议自己开发一个专用文件系统,hash 结构 树结构的

结合你的调用方式,是按批量调用无所谓顺序(机器学习训练材料),还是什么其他的调用方式去优化访问性能

要不 很多大厂有开源的碎文件 FS 可以试试
aloxaf
2020-06-03 15:54:55 +08:00
脸书针对这个问题发过一篇论文提出了 haystack 文件系统,很符合你的需求,SeaweedFS 是它的开源实现。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX