c++ - 磁盘数据库如何在文件系统级别处理文件读写?
问题描述
假设我要用 C++ 编写自己的数据库,并假设我将使用二叉树或哈希映射作为底层数据结构。我将如何处理对此数据结构的更新?
1)我应该先创建二叉树,然后以某种方式将其保存到磁盘上吗?每次必须更新数据时,我都需要打开这个文件并更新它?那不是一个昂贵的操作吗?
2)有没有办法直接处理二叉树而不将其加载到内存中然后再次持久化?
3)SQLite和Mysql是如何处理的?
4)我的主要问题是,数据库如何保存大量数据并同时对其进行更新,而无需每次打开和关闭文件。
解决方案
数据库将磁盘或文件视为一个大块设备,并在 M-way Balanced Trees 中管理块。他们在这些块中插入/更新/删除记录,并再次将脏块刷新到磁盘。它们管理空闲块的分配表,因此不需要在每次访问时重写数据库。由于 RAM 内存昂贵但速度快,因此页面保存在 RAM 缓存中。单独的索引(单独的文件或只是块)基于键管理快速访问。块通常是底层文件系统的本机分配大小(例如集群大小)。为原子性维护撤消/重做日志。等等
还有更多要说的,这个问题实际上属于计算机科学堆栈交换。如需更多信息,请阅读 Horowitz 和 Sahni,“数据结构基础”,第 496 页。
至于你的问题:
您打开它一次并在数据库管理器运行时保持打开状态。您可以根据需要分配存储空间并维护如上所述的 M 路树。
是的。您读取保存在缓存中的块。
和 4:见上文。
推荐阅读
- symfony - PhpStorm Symfony 路由丢失
- elasticsearch-plugin - elasticsearch-plugin list 命令中的 java.nio.file.FileSystemException
- django - 如何自定义和翻译 django 的 PasswordChangeForm 中的错误消息?
- r - `[<-.data.frame`(`*tmp*`, i, value = NULL) 中的错误:新列将在现有列之后留下孔
- ios - UIColor(命名:“colorname”)的持续问题?
- html - 如何定义类型
- spss - SPSS - 如何重新调整x轴
- arrays - 有没有一种优雅的方法来对 Julia 中的静态数组向量中的列进行求和?
- jupyter-notebook - POST 中缺少“_xsrf”参数 - 需要永久修复 - 其他建议的解决方案不起作用
- mongodb - 如何在以下场景中利用 redis 和 mongo?