
现在有个需求: 1 、本地存储 20w 条左右的数据 2 、一条数据大概有 20 个左右的字段,全部都是数字 3 、本身是用 Unity 开发,希望能够跨端方案 希望能够有较快的写入和读取速度,同时体积尽量小 请问除了 Sqlite 有其他更好的方案吗?
1 vance123 2022-01-05 10:14:11 +08:00 不能全读进内存吗,应该也就十几 M |
2 bfdh 2022-01-05 10:17:14 +08:00 20W 数据,sqlite 会不会性能不够? |
5 KagurazakaNyaa 2022-01-05 10:22:26 +08:00 200,000 左右的数据,每个数据是 20 个左右的字段,按数字算每个字段算 4 个 byte 应该足够了,也就是 200,000*20*4byte ,也就是约 16MB 的数据,你完全可以直接丢内存里 |
6 KagurazakaNyaa 2022-01-05 10:23:00 +08:00 @jhqz103 可以 dump 出来,比如 dump 成 gz 文件 |
7 web 官方默认储存方案是 indexedDB ,但你又不是 web ,只是一个普通的客户端版本,无论想怎么存都可以啊。 以前都流行 WebSQL, 也就是 sqlite ,现在风向变了,chrome 完全偏爱 KeyValue 数据库。 |
8 Soar360 2022-01-05 10:36:48 +08:00 SQLite 20 万数据做好索引问题不大的。批量插入每秒几万都很轻松,只是并发不高。 |
9 nobodyknows 2022-01-05 10:48:49 +08:00 不选 sqlite 迟早后悔 |
10 2i2Re2PLMaDnghL 2022-01-05 11:07:27 +08:00 除了 sqlite 以外最好的方案就是直接 dump 数据结构,下次打开就是直接 read 进内存拿个指针指一下。 |
11 sunny352787 2022-01-05 11:10:10 +08:00 我咋觉得你实际要面对的问题不是你描述的这个样子呢? 你是做的游戏吧?策划表数据的存储? |
12 jhqz103 OP @XiLingHost 也是,我试试这个方案 |
15 jhqz103 OP @nobodyknows 阿这。。我觉得上面 dump 内存的方案也可以一试,sqlite 我现在写入太慢,估计是我姿势不对。如果 sqlite 是最好的方案,那我就往这方面做就好 |
16 jhqz103 OP @2i2Re2PLMaDnghL 谢谢哈,上面也有提到,我试一下 |
17 jhqz103 OP @sunny352787 是做的游戏,不过不是存策划表,而是存一局游戏各个时间的状态。从设计角度,我肯定会尽量减少存储的数据量,不过目前精简下来,还是有这么多数据 orz |
18 Soar360 2022-01-05 11:35:35 +08:00 SQLite 要想插入快速,就是分批和事务。一万个 insert 语句放在一个事务里就行了。 |
19 Huelse 2022-01-05 11:40:31 +08:00 如果这个数据不需要局部更新的,总是全量读写的,那就直接放内存,像楼上说的那样。 如果需要局部更新,或者精细化的操作,最好还是上 sqlite 之类的库管理 |
20 vstar 2022-01-05 12:21:57 +08:00 又在做游戏了? |
21 chashao 2022-01-05 12:55:32 +08:00 每一局游戏给个 guid 表示,然后写入 guid 为文件名,内容是这一句状态的小文件里,不过不知道你需要怎么查。。 |
22 Harry 2022-01-05 13:34:14 +08:00 依然使用 SQLite ,它的读写速度快,而且稳定性上要比其他数据库高出非常多。 因为 SQLite 是文件数据库,所以你没有必要把很多数据都 塞到同一个 SQLite 数据库里。你可以 ① 根据业务分类;② 根据数据的读写频率;③ 只读 还是 读写 把数据归类一下。使用多个 SQLite 数据库。 这个方案可能最优。 |
24 jhqz103 OP @Soar360 是的,我看都是说开启事务来优化写入速度。不过我这边目前还是很慢,如果大方向(使用 sqlite )没错的话,我就继续研究下为何慢就行了 |
27 jhqz103 OP @Harry 先谢谢哈。我也有在考虑分多个,不过确实有两点是用 sqlite 有点大才小用的,一个是不会出现局部更改,一个是可能会比较频繁出现全局读 |
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 。你这个是要存游戏帧录像做回放的吧?那就直接存文件最好 |
29 sunny352787 2022-01-05 14:12:31 +08:00 使用 sqlite 确实会慢,因为会同步写 IO ,这种情况用什么数据库都一样,要么改成异步存,要么就别存数据库直接逐条写文件,如果没有强记录需求只是想做回放的话,战局结束之后统一存文件是最好的方式。 |
30 hanxiV2EX 2022-01-05 14:15:47 +08:00 |
31 sunny352787 2022-01-05 17:55:31 +08:00 @hanxiV2EX Unity 没法用,或者说很难使用 |
33 jhqz103 OP @sunny352787 非常感谢分享的链接,我试试效果怎么样。结束统一记录跟异步这个还是会做的,毕竟是比较通用的优化 |
35 netnr 2022-01-05 19:04:53 +08:00 via Android 经简单测试 SQLite 事物写入几万条数据比 MySQL SQLServer 批量插入 更快 另外 LiteDB Fir...DB 容易造成文件损坏,SQLite 经得住各种摧残 |