V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jhqz103
V2EX  ›  程序员

关于客户端的数据存储

  •  
  •   jhqz103 · 2022-01-05 09:55:36 +08:00 · 3312 次点击
    这是一个创建于 1083 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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