【发布时间】:2013-02-03 15:15:53
【问题描述】:
对于一个数据库类,我们正在实现我们自己的数据库,我无法在 C++ 中实现block storage(其中每个块为 1024 字节)。
我们将每个数据库表存储为硬盘上可随机访问的块集合,其中第一个块是文件头,专用于元数据(块 0),每个后续块专用于存储行的表。这些块将作为文件写入硬盘。我们还要有一个块作为“内存”缓冲区;我们可以读取和编辑缓冲区中的数据,当我们准备好时,我们将内存中的缓冲区写回磁盘。
我认为我可以将内存缓冲区概念化,但是我在如何将内存块写入文件时遇到了麻烦。我有两个想法,每个都有自己的困难:
想法 1
创建一个正好为 1024 字节的类 MemoryBlock。每个 MemoryBlock 可以存储任意数据(文件头或表的行)。通过将 MemoryBlocks 数组写入文件,将每个表存储为单个文件。
难度: 我可以更新文件中间的单个块吗?我的理解是文件必须被覆盖或附加到。如果我有一个包含 3 个内存块(块 0-2)的文件,并且我想更新块 1 中的一行,我可以将块 1 拉到我的缓冲区中,编辑它,然后将其写回中间文件,或我是否必须将整个文件拉入内存,编辑我想要的内容,然后覆盖原始文件?
想法 2
将每个块作为单独的文件存储在磁盘上。这将允许我随机访问任何块并将其写回磁盘,而不必担心表的其余部分
难度:我不确定这是否真的强制执行 1024 字节块大小。有没有办法要求每个文件不超过1024字节?
我对这两个想法都不满意,但我很感激任何有助于我更好地理解数据库管理系统中的块存储的意见。
编辑:正如@zaufi 指出的那样,1024 字节的块大小非常不典型。我的意思是在写这篇文章时输入 4096 字节块。
【问题讨论】:
-
使用 fseek() 在文件中间写入。
-
啊哈,我想这正是我想要的,@brianbeuning
标签: c++ memory memory-management block database