V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiangwei2222
V2EX  ›  问与答

本地百万级别小文件存储有什么优化空间吗

  •  
  •   jiangwei2222 · 2022-04-12 11:30:30 +08:00 · 2751 次点击
    这是一个创建于 984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    存储的内容全部是图片,每张图片大约 100kb ,目前磁盘使用的 1T 的三星 SSD 硬盘,NTFS 格式。

    目前问题

    1 、Windows 操作系统根本打不开文件夹

    2 、Linux 系统执行不了 ls 命令,使用 Linux 桌面也进不去文件夹

    注:

    1 、为啥要存到本地

    因为都是机器学习的训练集,存在本地才能读取
    

    2 、为啥要打开文件夹

    因为要做图片预处理,比如去背景这类似的操作,预处理完要大致浏览一般所有样本
    

    3 、为啥不使用 xxxx

    因为不打算改代码,目前代码全部都是直接读磁盘文件,换一下存储方案改动非常多(真的非常非常多,图片预处理脚本就有几十个,然后是各种训练脚本,再加上各种测试脚本)
    
    18 条回复    2022-04-13 19:47:15 +08:00
    murmur
        1
    murmur  
       2022-04-12 11:31:39 +08:00
    为啥不分层存储呢 分三级,建子文件夹,到时候遍历进去就可以啊
    OysterQAQ
        2
    OysterQAQ  
       2022-04-12 11:33:15 +08:00 via iPhone
    Minio
    3dwelcome
        3
    3dwelcome  
       2022-04-12 11:36:11 +08:00 via Android   ❤️ 1
    同楼上,用 hash 头分组文件夹就可以了。
    web 后端的附件图片上传文件系统,大多都是这种结构。
    LeslieLeung
        4
    LeslieLeung  
       2022-04-12 11:36:34 +08:00 via iPhone
    满足不了打开文件夹预览的方法我倒是想到一个,用 pickle 存,然后封装读写方法给训练和测试脚本,代码改动不大。(这个方法减小了碎片化读取,能节省读取时间)
    dickie
        5
    dickie  
       2022-04-12 11:37:58 +08:00
    其实百万不算多 问题是你没有分文件夹 分三层 一层十个文件夹能解决
    dickie
        6
    dickie  
       2022-04-12 11:41:42 +08:00
    然后的话其实改存储如果代码变动很大 那是代码的问题 不管从本地还是网络存储读完文件应该统一,面向接口 而不是面向具体
    ClericPy
        7
    ClericPy  
       2022-04-12 11:49:00 +08:00
    1 、为啥要存到本地

    这个问题前面有人提到 minio 搞个对象存储其实改动不大, 不过既然已经选了本地文件还不想动太多代码. 要么像前面说的文件夹分层, 做多层哈希前缀, 遇到文件夹里文件数量不均衡参考下环形哈希? 要么就先不动, 日常不要运行 ls. 很早以前工作存放视频本地缓存文件时候搞过类似的, 反正别轻易遍历(当时才四五十万就崩了)

    2 、为啥要打开文件夹

    预览就不要用系统自带的方式了, 自己搞个脚本取样几个文件可以么. 毕竟去背景时候是有日志的, 把文件名记下来, 逐行消费日志取样你想要的文件名, 然后直接把这些取样复制出来或者渲染到 HTML 里用浏览器看

    3 、为啥不使用 xxxx

    怕麻烦就别改. 反正原型项目确实奥卡姆剃刀没毛病, 以后正式环境再考虑复杂设计



    总结就是, 想不花成本解决问题基本没戏, 绕开问题更换解决思路吧
    0o0O0o0O0o
        8
    0o0O0o0O0o  
       2022-04-12 11:51:49 +08:00 via iPhone
    既然你加了这么多限制条件,那就自己写个简单的 explorer 吧,如果不是频繁新增文件,就定期遍历一次然后把文件数据持久化
    privil
        9
    privil  
       2022-04-12 11:57:31 +08:00   ❤️ 1
    说 minio 的想啥呢,直接上 seaweedfs 不少你这种需求的在用 seaweedfs ,赶紧上,用了你会回来感谢我的
    privil
        10
    privil  
       2022-04-12 11:58:18 +08:00
    seaweedfs 再挂载成文件系统用,就完事了
    fxxkgw
        11
    fxxkgw  
       2022-04-12 18:22:50 +08:00
    linux 下可以用 ls -1 -f > xxx.file 方式快速看文件的
    carmark
        12
    carmark  
       2022-04-12 19:12:46 +08:00
    @OysterQAQ 这个明显不靠谱,minio 并没有优化海量文件的问题。后端存储还是单独按文件存的。

    海量小文件优化,还是要做聚合,减少文件检索带来的磁盘操作。
    paopjian
        13
    paopjian  
       2022-04-12 19:21:29 +08:00
    非要用文件浏览器打开吗?都要做机器学习了,直接用脚本读取,拆分到小文件夹里不好么
    jiangwei2222
        14
    jiangwei2222  
    OP
       2022-04-12 19:41:21 +08:00 via Android
    @privil 害,折腾了 5 个多小时,没把 seaweeds 搭建起来,看了一下介绍,感觉确实非常适合。可惜运维难度有点高
    OysterQAQ
        15
    OysterQAQ  
       2022-04-12 21:26:38 +08:00 via iPhone
    @carmark 我记错了,应该是 seaweed
    privil
        16
    privil  
       2022-04-12 23:23:49 +08:00   ❤️ 1
    @jiangwei2222 #14 官方文档偏向开发角度,可以参照一下这两篇文章部署,https://www.trojansun.com/seaweedfs-guidance.html https://bambrow.com/20220107-seaweedfs-installation-guide/
    ebingtel
        17
    ebingtel  
       2022-04-13 11:07:41 +08:00   ❤️ 1
    也可以通过 offset ,把小文件存储到大文件里面,比如 64M 一个大文件
    jiangwei2222
        18
    jiangwei2222  
    OP
       2022-04-13 19:47:15 +08:00 via Android
    @privil 多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2604 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:02 · PVG 20:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.