“写优化”的数据结构(1):AOF和b-tree之间

简介:

作者: 一工

 

这里谈的“写优化”,是针对HDD(hard disk drive)的,宗旨就是尽量避免disk seek的产生。

首先拿AOF(Append Only File)和b-tree两个“端”谈起。

 

1) AOF
无论是随机写还是顺序写,在AOF里是没有什么区别,也是最快的。如果搞个坐标图,它的“江湖”地位就是:

21

它几乎没有disk seek,但随机读是不可接受的!

 

 

2) b-tree
各大存储引擎御用的数据结构,但这里要说的是:它有缺陷,算不上“写优化“的。
假设b-tree的每个node大小为16KB,数据文件大小为160GB,总共会有100万个node。
在随机写的过程中,新node的生成过程就是个布朗运动(一个node的child node在文件里是离散的,可能在它附近,也可能很远),产生了大量的disk seek,此时的page cache利用率也不高。这就是它的一个缺陷。
但是随机读是比较快的(复杂度是O(logN))(即使是100万个node,如果分支因子是1000,一次随机读最多2次disk seek)。
b-tree的江湖地位是:

22

从图(2)可以看出,b-tree和AOF占据两个“端”,存在不存在一种数据结构,是二者的合体呢?这样就完美了,可惜是没有 :D,不过可以在这两者之间做平衡。

23

图(3)中的蓝色线,就是“随机写”和“随机读“两者做trade off后的一个曲线图,在这条曲线上,有levelDB使用的LSM-Tree,也有Acunu使用的basic-COLA(https://acunu-videos.s3.amazonaws.com/dajs.html) 。
其中红色箭头所指的地方是个“风水宝地”,在这里,随机写和读都还不错,从I/O复杂度上来讲,这里的读接近O(logN),写则是O(logN / x),x是个常数项(写优化的数据结构其实就是在b-tree身上做常数项优化)。

 

接下来要介绍的就是这个“风水宝地”里的一种数据结构:buffered tree(搞这个比较出名的该属Lars Arge, http://www.madalgo.au.dk/~large/ )。
这种数据结构在写的时候,与b-tree最大的区别就是:不会从root查找,找到正确的node再插入,没有root-to-leaf的查找过程。
而是直接插到root节点,如果root节点满了,就把数据刷到它的子节点,如果某个子节点满了,就继续刷到子子节点,一直重复下去。只有当节点满的时候,才有disk seek产生。

 

且node大小可以设置很大,比如4MB,这样4MB才可能产生一次disk seek,已经很不错了。
如果一个node设置很大,为提高读,就需要对这个node做更细的划分,分成多个小块,随机读I/O复杂度也是O(logN)。

 

“写优化“的数据结构很多,就是在那条蓝色曲线上躺着很多种数据结构,但是buffered tree是比较出色的。
下一小节会简单谈谈buffered tree … …

相关文章
|
8月前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
168 0
|
8月前
|
存储 搜索推荐 关系型数据库
深度探讨数据库索引的数据结构及优化策略
深度探讨数据库索引的数据结构及优化策略
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
84 1
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
63 6
|
7月前
|
存储 缓存 算法
Python中常用的数据结构与算法优化技巧指南
Python是一种强大而灵活的编程语言,它提供了丰富的数据结构和算法库,但是在处理大规模数据或者需要高效运行的情况下,需要考虑一些优化技巧。本文将介绍一些Python中常用的数据结构与算法优化技巧,并附带代码实例,帮助你更好地理解和运用。
|
8月前
|
存储 监控 NoSQL
Redis处理大量数据主要依赖于其内存存储结构、高效的数据结构和算法,以及一系列的优化策略
【5月更文挑战第15天】Redis处理大量数据依赖内存存储、高效数据结构和优化策略。选择合适的数据结构、利用批量操作减少网络开销、控制批量大小、使用Redis Cluster进行分布式存储、优化内存使用及监控调优是关键。通过这些方法,Redis能有效处理大量数据并保持高性能。
106 1
|
4月前
|
数据采集 JavaScript 前端开发
使用 TypeScript 接口优化数据结构
使用 TypeScript 接口优化数据结构
|
5月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
129 3
|
5月前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
75 0

热门文章

最新文章