就像std::unordered_map<std::string, std::string>
一样,但所有数据都应该存储在磁盘而不是内存中。
据我了解,应该完成两个部分:索引和存储。我已经学习了一些关于索引的数据结构,比如Linear-Hash或B-Tree,并且编写磁盘上的int-&gt; int数据库并不太难。问题是存储。
对于整数,所有记录的大小相同。一旦我们通过索引获得记录的位置,我们就可以轻松地提取,修改或延迟删除。但对于字符串,记录的大小是灵活的。它应该(至少)有以下问题:
put()一个更长的字符串:我们不能简单地覆盖旧记录,我们dave做del()和put()并浪费旧记录的空间。
del():旧记录的空间也被浪费了,不能再使用了。 (也许我们可以用垃圾收集器收集已删除的空间,但它需要额外的空间并制作片段)
对于int-&gt; int数据库,浪费几个整数的空格不是一个大问题。但是字符串越长,浪费的空间就越多。
我需要一些建议/提示来解决问题。
答案 0 :(得分:1)
您可以将文件系统如何管理可变大小的文件作为示例。
他们分别以大约几千字节的固定大小的块分配文件空间,并将这些块链接在一起形成任意长度的整个文件。
如果您需要扩展文件,则需要分配和链接更多块。如果您需要缩小或删除它,请取消链接并释放一个或多个块。
关于这里唯一明显的碎片是内部的,每个文件的最后一个块中浪费的空间。
如果使用文件实现此操作,其中每个块都是潜在大文件的一部分或者是自己的文件,则不需要立即删除/释放它。您可以将控件/元数据中的标记为空闲,然后再重复使用。您可以实现压缩(删除所有空闲块)作为不经常执行的单独操作。
答案 1 :(得分:0)
首先实现映射器。每当您获得新字符串时,将它们按顺序存储在文件中,并将它们的位置存储在地图上。
答案 2 :(得分:0)
对我而言,这听起来像是键/值存储的定义。您可以使用任何您喜欢的系统。从Oracle的Berkeley DB到Cassandra或Riak。