1
join OP WAL 是不是解决这个问题用的?
|
2
no1xsyzy 2021-06-01 22:18:35 +08:00
从块文件的层面去考虑的话,长度改变后面的全部都要重新写一遍。
文件系统可能允许文件分为多个块或者簇,它们可以变长的话可能可以解决。 sqlite 说是有并发问题的…… 应当也是全读全写?可能有 padding 空间?可能允许乱序? |
3
lululau 2021-06-01 22:21:00 +08:00
做不到,文本编辑器要么是重新写一遍,要么是用一个新文件替换到原有文件
|
5
XiaoxiaoPu 2021-06-01 22:58:12 +08:00
数据库会尽量避免改变长度。可以看下 LSM 树的原理,将磁盘随机写操作转化为顺序写操作,相比 B+树的存储结构好理解一些。
|
6
coldear 2021-06-02 02:54:08 +08:00
长度不确定没发 in place, 关系型数据库都字段都是固定长度的。
|
7
mingl0280 2021-06-02 03:12:17 +08:00
数据库原理没有学好就是这样的。
数据库文件本身内部会有数据库软件的分页,每个分页的长度固定,然后数据库软件会在文件前部保持一个对页的索引,这样数据库的 IO 就只需要读写一个页(如果不够长会重新分配页,一般在文件尾部直接增长)。效率比重写一大截文件好很多。 但是,如果你是一个普通的二进制文件,那么你只能把后半截保存下来然后删掉重写…… |
8
kokutou 2021-06-02 07:06:15 +08:00 via Android
有个办法是长度对齐,空余的填 0 。
然后写入就是一块一块的写入。自己计算末尾 0 的个数。 有的游戏存档是这样做的,虽然没到 1g 这么大,但是这样都是相同长度,应该是因为程序写起来方便吧。 |
9
join OP @mingl0280 是的,感谢指点。我确实这块没学好,赶紧学习去。如果按你这样说的,sqlite 岂不是数据库越大,性能越差?但看起来好像不是这样的,他们也没用 lsm,只是用 b 树。
|
11
jorneyr 2021-06-02 10:22:32 +08:00
sqlite 之类的,创建一个大一些的文件,写入的数据都是从文件中预定一段然后写入,并不是顺序的写入。
|
13
sxw 2021-06-02 15:44:08 +08:00
@join 可以用 "r+" 打开文件,seek 到要修改的地方。https://es2q.com/blog/2019/02/22/modify_file_without_rewrite/
|
16
liuxu 2021-06-02 21:12:28 +08:00
1 个 G 不是大文件吧,现在内存条再怎么涨价也就 300 块钱 8G,买一个插上
|
17
mingl0280 2021-06-02 22:18:59 +08:00 via Android
@join SQLite 数据库确实越大性能越差,不知道你这个看起来不是这样是哪来的……BTree 就是维护的 Pager 索引,也不知道你说的只用 b 树是哪来的。
|
18
join OP |