【问题标题】:implementing block storage for a database为数据库实现块存储
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 实际上,1024 字节的块是一个错字。我面前有 4096,但是当我写这个问题时已经有点晚了。
  • 另外,任务重新发明轮子。在整个学期中,我们都在构建部分 dbms 并增加我们的设计,以便在每次迭代时更加高效。我们特别应该将表存储为硬盘上的内存块,并使用 1 块内存缓冲区访问块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2016-09-30
相关资源
最近更新 更多