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