实现数据库的块存储

时间:2013-02-19 02:54:14

标签: c++ memory memory-management block database

对于数据库类,我们正在实现自己的数据库,我在如何在C ++中实现block storage时遇到问题(每个块都是1024字节)。

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

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

想法1

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

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

创意2

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

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


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


编辑:正如@zaufi指出的那样,1024字节的块大小非常不典型。我打算在写这个时键入4096个字节块。

1 个答案:

答案 0 :(得分:1)

哦,伙计,你肯定需要阅读关于数据库内部的信息......

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

和顺便说一下,在文件中间更新smth总是坏主意......但如果性能不是您的关注,那么您绝对可以做到......

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