这个 PR 将存储对象的过程完全分为独立的两步(过去是混合的一步):也就是先持久化对象里的所有string,再持久化对象结构本身。
这个 PR 将存储对象的过程完全分为独立的两步(过去是混合的一步):也就是先持久化对象里的所有string,再持久化对象结构本身。
这样的优势在于:持久化所有string时,可以让硬盘连续写入,避免随机写入。而再持久化对象时,也可以继续让硬盘连续写入,避免随机写入。
这样优化后,写入过程会变成完全顺序写入。同时,写入大批量的string时,无需频繁的修改string文件的大小值,能够将磁盘的重寻址次数减半。进一步对机械硬盘友好。
可以继续改进的地方:
- 阅读过程仍然是随机阅读的。这里可以做一些优化,因为我其实是可以根据要阅读的对象列表,计算出需要阅读的string文件的地址块所在的位置,从而提前复制到内存里,来实现硬盘的连续阅读。
- 写入string的过程不再是多线程加锁(好吧其实这也是单线程),而变成了单线程。这样的优势是为了确保机械硬盘的连续写入和降低重寻址次数。
- 写入string的文件只有一个。为了确保它的大小是安全的,无法使用多线程。但是,我们可以开辟N个string文件分区,从而集成多线程写入string。虽然这对磁盘来说是坏事,但是我毕竟没有测过硬盘写入单线程快还是多线程快。可以试试这个方案。不过,反复重寻址是无论机械还是固态都慢。
Edited by Anduin Xue