0

对于一个数据库类,我们正在实现我们自己的数据库,我在如何在 C++ 中实现块存储时遇到了麻烦(其中每个块是 1024 字节)。

我们将每个数据库表存储为硬盘上可随机访问的块集合,其中第一个块是文件头,专用于元数据(块 0),每个后续块专用于存储表的行. 这些块将作为文件写入硬盘。我们还要有一个块作为“内存”缓冲区;我们可以读取和编辑缓冲区中的数据,当我们准备好时,我们将内存缓冲区写回磁盘。

我想我可以概念化内存缓冲区,但是我在如何将内存块写入文件时遇到了麻烦。我有两个想法,每个都有自己的困难:

理念一

创建一个正好为 1024 字节的类 MemoryBlock。每个 MemoryBlock 可以存储任意数据(文件头或表的行)。通过将 MemoryBlocks 数组写入文件,将每个表存储为单个文件。

难点: 我可以更新文件中间的单个块吗?我的理解是文件必须被覆盖或附加到。如果我有一个包含 3 个内存块(块 0-2)的文件,并且我想更新块 1 中的一行,我可以将块 1 拉到我的缓冲区中,编辑它,然后将其写回中间文件,还是我必须将整个文件拉入内存,编辑我想要的内容,然后覆盖原始文件?

想法 2

将每个块作为单独的文件存储在磁盘上。这将允许我随机访问任何块并将其写回磁盘,而不必担心表的其余部分

难度:我不确定这是否真的强制执行 1024 字节块大小。有没有办法要求每个文件不超过1024字节?


我对这两个想法都不满意,但我很感激任何有助于我更好地理解数据库管理系统中的块存储的输入。


编辑:正如@zaufi 指出的那样,1024 字节的块大小非常不典型。我的意思是在写这篇文章时输入 4096 字节块。

4

1 回答 1

1

哦,伙计,您肯定需要阅读有关数据库内部结构的信息...

这是我的 5 美分:两个想法都不好!为什么你决定使用 1024 字节块???现代硬盘的物理扇区大小为 4096 字节!磁盘控制器有缓存4M-6M-8M-16M-...所以写1K只是浪费资源...

顺便说一句,在文件中间更新 smth 总是坏主意......但如果性能不是你关心的,你绝对可以这样做......

在重新发明轮子之前,请尝试研究各种 DMBS 中使用的典型方法......还有一个好的(简单)阅读来源:谷歌关于leveldb和 firends...... - 这肯定会给你一些想法!

于 2013-02-19T03:19:44.330 回答