c++ - C++中STL::map数据的随机文件访问

标签 c++ file dictionary stl

我有一个 STL::map 数据结构

key:data pair

我需要将其存储在二进制文件中。

  • key 是一个无符号的短值,并且不是连续的
  • 数据是另一个大结构,但大小固定。

这张 map 是根据一些用户的添加、修改或删除操作来管理的。而且我每次更新 map 时都必须保持文件更新。这是为了在系统崩溃的情况下幸存下来。 添加总是可以在文件末尾完成。但是,用户可以修改或删除任何现有记录。 这意味着我必须随机访问文件来更新修改/删除的记录。 我的问题是:

  • 有没有一种方法可以直接找到文件中修改过的记录,而无需依次搜索整个记录? (最大记录大小为 5000)
  • 删除时,如何将其从文件中删除并将下一条记录移动到已删除记录的位置?

感谢您的帮助!

最佳答案

假设您不需要 std::map 的树结构,您只需要一个关联容器,我见过的最常见的方法是有两个文件:一个带有键,一个带有数据。在 key 文件中,它将包含所有 key 以及数据文件中数据的相应偏移量。由于您说数据的大小都相同,因此更新应该很容易(因为它不会更改任何偏移量)。添加是通过追加完成的。删除是唯一困难的部分;您可以删除 key 以将其从数据库中删除,但是如果您想跟踪“释放”的数据部分并尝试覆盖它们,则由您决定。要跟踪 key ,您可能需要内存中的另一个关联容器(map 或 unordered_map),其中包含 key 文件中 key 的位置。


编辑:例如, key 文件可能是(注意偏移量以字节为单位)

key1:0
key2:5

对应的数据文件是

data1data2

这是一个久经考验的真实模式,用于从 hadoop 到高速本地数据库的每个人。要了解您可能会考虑的持久性并发症,我强烈建议您阅读 this Redis blog ,当我处理类似问题时,它教会了我很多关于坚持的知识。

关于c++ - C++中STL::map数据的随机文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929478/

相关文章:

c# - 将对象转换为 Dictionary<TKey, TValue>

Python:使字典列表相对于一个键是唯一的

python - 如何将字典的动态值写入csv python

c++ - 将具有 unique_ptr 的类的构造函数作为成员复制到抽象类

c++ - 从字符串创建数组

c++ - 用文件内容的第一行替换文件名

c# - 打开文件夹并选择多个文件

c++ - while( cin >> value ) 在我输入一个字符时打破循环

c++ - 用常量值填充 std::vector<double>

java - FileNameFilter 和 FileFilter 的使用