实现:字符串到字符串数据库

时间:2013-04-17 00:05:27

标签: database algorithm data-structures nosql storage

就像std::unordered_map<std::string, std::string>一样,但所有数据都应该存储在磁盘而不是内存中。

据我了解,应该完成两个部分:索引和存储。我已经学习了一些关于索引的数据结构,比如Linear-Hash或B-Tree,并且编写磁盘上的int-&gt; int数据库并不太难。问题是存储。

对于整数,所有记录的大小相同。一旦我们通过索引获得记录的位置,我们就可以轻松地提取,修改或延迟删除。但对于字符串,记录的大小是灵活的。它应该(至少)有以下问题:

  1. put()一个更长的字符串:我们不能简单地覆盖旧记录,我们dave做del()和put()并浪费旧记录的空间。

  2. del():旧记录的空间也被浪费了,不能再使用了。 (也许我们可以用垃圾收集器收集已删除的空间,但它需要额外的空间并制作片段)

  3. 对于int-&gt; int数据库,浪费几个整数的空格不是一个大问题。但是字符串越长,浪费的空间就越多。

  4. 我需要一些建议/提示来解决问题。

3 个答案:

答案 0 :(得分:1)

您可以将文件系统如何管理可变大小的文件作为示例。

他们分别以大约几千字节的固定大小的块分配文件空间,并将这些块链接在一起形成任意长度的整个文件。

如果您需要扩展文件,则需要分配和链接更多块。如果您需要缩小或删除它,请取消链接并释放一个或多个块。

关于这里唯一明显的碎片是内部的,每个文件的最后一个块中浪费的空间。

如果使用文件实现此操作,其中每个块都是潜在大文件的一部分或者是自己的文件,则不需要立即删除/释放它。您可以将控件/元数据中的标记为空闲,然后再重复使用。您可以实现压缩(删除所有空闲块)作为不经常执行的单独操作。

答案 1 :(得分:0)

首先实现映射器。每当您获得新字符串时,将它们按顺序存储在文件中,并将它们的位置存储在地图上。

答案 2 :(得分:0)

对我而言,这听起来像是键/值存储的定义。您可以使用任何您喜欢的系统。从Oracle的Berkeley DB到Cassandra或Riak。