V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jhqz103
V2EX  ›  程序员

关于客户端的数据存储

  •  
  •   jhqz103 · 131 天前 · 2290 次点击
    这是一个创建于 131 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有个需求: 1 、本地存储 20w 条左右的数据 2 、一条数据大概有 20 个左右的字段,全部都是数字 3 、本身是用 Unity 开发,希望能够跨端方案 希望能够有较快的写入和读取速度,同时体积尽量小 请问除了 Sqlite 有其他更好的方案吗?

    36 条回复    2022-01-06 10:05:12 +08:00
    vance123
        1
    vance123  
       131 天前
    不能全读进内存吗,应该也就十几 M
    bfdh
        2
    bfdh  
       131 天前
    20W 数据,sqlite 会不会性能不够?
    jhqz103
        3
    jhqz103  
    OP
       131 天前
    @vance123 主要还是想本地存储,下次打开可以用,不然放内存是最容易的
    jhqz103
        4
    jhqz103  
    OP
       131 天前
    @bfdh 我也担心这个问题 orz 自己对这个又不擅长,所以想看看各位大佬有没有推荐的
    XiLingHost
        5
    XiLingHost  
       131 天前
    200,000 左右的数据,每个数据是 20 个左右的字段,按数字算每个字段算 4 个 byte 应该足够了,也就是 200,000*20*4byte ,也就是约 16MB 的数据,你完全可以直接丢内存里
    XiLingHost
        6
    XiLingHost  
       131 天前
    @jhqz103 可以 dump 出来,比如 dump 成 gz 文件
    3dwelcome
        7
    3dwelcome  
       131 天前
    web 官方默认储存方案是 indexedDB ,但你又不是 web ,只是一个普通的客户端版本,无论想怎么存都可以啊。

    以前都流行 WebSQL, 也就是 sqlite ,现在风向变了,chrome 完全偏爱 KeyValue 数据库。
    Soar360
        8
    Soar360  
       131 天前
    SQLite 20 万数据做好索引问题不大的。批量插入每秒几万都很轻松,只是并发不高。
    nobodyknows
        9
    nobodyknows  
       131 天前
    不选 sqlite 迟早后悔
    2i2Re2PLMaDnghL
        10
    2i2Re2PLMaDnghL  
       131 天前
    除了 sqlite 以外最好的方案就是直接 dump 数据结构,下次打开就是直接 read 进内存拿个指针指一下。
    sunny352787
        11
    sunny352787  
       131 天前
    我咋觉得你实际要面对的问题不是你描述的这个样子呢?

    你是做的游戏吧?策划表数据的存储?
    jhqz103
        12
    jhqz103  
    OP
       131 天前
    @XiLingHost 也是,我试试这个方案
    jhqz103
        13
    jhqz103  
    OP
       131 天前
    @3dwelcome 我这个是客户端,确实有很多存的方法,不过想找个较优的
    jhqz103
        14
    jhqz103  
    OP
       131 天前
    @Soar360 我现在写入很慢,可能是这些没做好
    jhqz103
        15
    jhqz103  
    OP
       131 天前
    @nobodyknows 阿这。。我觉得上面 dump 内存的方案也可以一试,sqlite 我现在写入太慢,估计是我姿势不对。如果 sqlite 是最好的方案,那我就往这方面做就好
    jhqz103
        16
    jhqz103  
    OP
       131 天前
    @2i2Re2PLMaDnghL 谢谢哈,上面也有提到,我试一下
    jhqz103
        17
    jhqz103  
    OP
       131 天前
    @sunny352787 是做的游戏,不过不是存策划表,而是存一局游戏各个时间的状态。从设计角度,我肯定会尽量减少存储的数据量,不过目前精简下来,还是有这么多数据 orz
    Soar360
        18
    Soar360  
       131 天前
    SQLite 要想插入快速,就是分批和事务。一万个 insert 语句放在一个事务里就行了。
    Huelse
        19
    Huelse  
       131 天前
    如果这个数据不需要局部更新的,总是全量读写的,那就直接放内存,像楼上说的那样。
    如果需要局部更新,或者精细化的操作,最好还是上 sqlite 之类的库管理
    vstar
        20
    vstar  
       131 天前
    又在做游戏了?
    chashao
        21
    chashao  
       131 天前
    每一局游戏给个 guid 表示,然后写入 guid 为文件名,内容是这一句状态的小文件里,不过不知道你需要怎么查。。
    Harry
        22
    Harry  
       131 天前
    依然使用 SQLite ,它的读写速度快,而且稳定性上要比其他数据库高出非常多。

    因为 SQLite 是文件数据库,所以你没有必要把很多数据都 塞到同一个 SQLite 数据库里。你可以 ① 根据业务分类;② 根据数据的读写频率;③ 只读 还是 读写 把数据归类一下。使用多个 SQLite 数据库。

    这个方案可能最优。
    jhqz103
        23
    jhqz103  
    OP
       131 天前
    @vstar 自己做着玩哈哈,又不是工作
    jhqz103
        24
    jhqz103  
    OP
       131 天前
    @Soar360 是的,我看都是说开启事务来优化写入速度。不过我这边目前还是很慢,如果大方向(使用 sqlite )没错的话,我就继续研究下为何慢就行了
    jhqz103
        25
    jhqz103  
    OP
       131 天前
    @Huelse 是全量读写的,所以我两个都试试,看看哪种适合哈,谢谢
    jhqz103
        26
    jhqz103  
    OP
       131 天前
    @chashao 这个可以的,不过主要是很多局游戏都要同时查,如果分的太多,同时读感觉也不好
    jhqz103
        27
    jhqz103  
    OP
       131 天前
    @Harry 先谢谢哈。我也有在考虑分多个,不过确实有两点是用 sqlite 有点大才小用的,一个是不会出现局部更改,一个是可能会比较频繁出现全局读
    sunny352787
        28
    sunny352787  
       131 天前
    @jhqz103 按你的需求,应该用不上 sqlite ,sqlite 在 Unity 里使用起来比较麻烦,推荐你用 nosql

    https://github.com/rejemy/UltraLiteDB
    https://www.iboxdb.com/

    这两个都是免费的 Unity 可以用的嵌入 nosql ,性能都不错,LiteDB 开源 iBoxDB 不开源,挑一个用就是了

    不过要是我做的话,对于你的这个情况我可能直接存文件了,dump 内存或者 protobuf 。你这个是要存游戏帧录像做回放的吧?那就直接存文件最好
    sunny352787
        29
    sunny352787  
       131 天前
    使用 sqlite 确实会慢,因为会同步写 IO ,这种情况用什么数据库都一样,要么改成异步存,要么就别存数据库直接逐条写文件,如果没有强记录需求只是想做回放的话,战局结束之后统一存文件是最好的方式。
    hanxiV2EX
        30
    hanxiV2EX  
       131 天前
    https://github.com/Tencent/MMKV

    这个号称性能很强的 kv 数据库呢?
    sunny352787
        31
    sunny352787  
       131 天前
    @hanxiV2EX Unity 没法用,或者说很难使用
    cssk
        32
    cssk  
       131 天前 via iPhone
    @jhqz103 # transaction 很快
    jhqz103
        33
    jhqz103  
    OP
       131 天前
    @sunny352787 非常感谢分享的链接,我试试效果怎么样。结束统一记录跟异步这个还是会做的,毕竟是比较通用的优化
    jhqz103
        34
    jhqz103  
    OP
       131 天前
    @cssk 好的,估计是我现在使用的姿势有问题,我研究下
    netnr
        35
    netnr  
       131 天前 via Android
    经简单测试 SQLite 事物写入几万条数据比 MySQL SQLServer 批量插入 更快
    另外 LiteDB Fir...DB 容易造成文件损坏,SQLite 经得住各种摧残
    jhqz103
        36
    jhqz103  
    OP
       130 天前
    @netnr 啊这。。我昨天暂时还没发现损坏,不过 sqlite 我试了下,事务一次插入 5000 条数据还是很快的。所以速度差距不大的情况下,估计 sqlite 还是优先
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1209 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:52 · PVG 06:52 · LAX 15:52 · JFK 18:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.