现在有个需求: 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
XiLingHost 2022-01-05 10:22:26 +08:00
200,000 左右的数据,每个数据是 20 个左右的字段,按数字算每个字段算 4 个 byte 应该足够了,也就是 200,000*20*4byte ,也就是约 16MB 的数据,你完全可以直接丢内存里
|
6
XiLingHost 2022-01-05 10:23:00 +08:00
@jhqz103 可以 dump 出来,比如 dump 成 gz 文件
|
7
3dwelcome 2022-01-05 10:24:36 +08:00
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 经得住各种摧残 |