c++ - 我可以将键值对的内存映射文件重新解释为映射以便对它们进行排序吗?

标签 c++ dictionary mmap reinterpret-cast

我有一个包含键值对的内存映射文件。 key 和 value 都是 uint32_t,所有的 key 和 value 都以二进制形式存储在文件中,其中 key 紧跟 value。该文件仅包含这些对,没有分隔符。

我希望能够通过递增键对所有这些键值对进行排序。

我的代码中编译了以下内容:

struct FileAsMap { map<uint32_t, uint32_t> keyValueMap; };
const FileAsMap* fileAsMap = reinterpret_cast<FileAsMap*>(mmappedData);

但我真的不知道从这里开始做什么,因为根据定义, map 容器通过键保持对对的严格弱排序。如果我只是将映射文件重新解释为 map ,我怎样才能让这些对排序?

最佳答案

这不是答案,但解释不符合评论限制。

映射中的键通常是唯一的(至少在 std::map 中是这样)。但是 map 通常在对存储的键进行排序的方法上各不相同。例如 std::map 基于平衡二叉树,检索给定键的平均复杂度等于 O(ln(n)) 其中 n 是多个 map 中的元素。或者例如std::unordered_map 是内部的 hashmap,平均访问时间为 O(1)。也就是说,无论内部元素的数量如何,它都会在恒定时间内寻找一个键。

在任何情况下,所有这些数据容器都需要专用的内部内存结构,这实际上从来都不像一个简单的键值对流。这就是为什么我在上面的第一条评论中说过,几乎不可能重用其中一个标准映射作为方便的数据访问器来访问 mmap 数据,而无需事先读取和解压缩数据流。

但是您可以创建自己的类似 map 的类,该类将遍历 mmap 区域中的数据,并检查其 operator[](size_t i) 如果存储的键与请求的键匹配.我想最简单的实现只需要一屏代码。

但请注意:顺序扫描是一项相对昂贵的操作,因此如果文件中有足够 元素,它可能会变得无法接受的慢。在这种情况下,您需要一些优化的索引。例如,在处理开始时读取所有键并构建索引数组。但所有这些问题都在很大程度上取决于任务细节,所以现在最好停止解释。

如果您有任何其他问题,请随时提出。当然,一个好问题假设你已经研究过这个主题,现在遇到了一个你自己无法解决的特定问题

关于c++ - 我可以将键值对的内存映射文件重新解释为映射以便对它们进行排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33205037/

相关文章:

c++ - 我可以在下面的程序中使用 sem_open 吗,但是我在这里看到了崩溃?

python - 类型错误 : unhashable type: 'list' for webscraping project

带有字节序转换的 Python 文件 Slurp

c - 在什么情况下我们在 mmap 中将文件描述符设置为 -1?

c - mmap MAP_SHARED 不工作

c++ - 局部变量模板的实例化

c++ - Boost 状态图库——如何实现耗时的转换

c++ - 在 C++ 中通过命名管道传递结构的 char*

c++ - 真的对 map::erase() 感到困惑

c++ - map.insert : "Invalid arguments" error with pair<enum, vector <*>>