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

Can I reinterpret a memory mapped file of key-value pairs as a map in order to sort them?

本文关键字:映射 排序 解释 内存 键值对 文件 我可以 新解释      更新时间:2023-10-16

我有一个包含键值对的内存映射文件。键和值都是uint32_t,所有的键和值都以二进制形式存储在文件中,其中一个键立即处理值。文件只包含这些对,不包含分隔符。

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

下面的代码在我的代码中编译:

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

,但我真的不知道从这里做什么,因为根据定义,映射容器保持严格的弱顺序对键。如果我只是将映射文件重新解释为一个映射,那么我如何使这些对排序呢?

这不是答案,但解释不适合注释限制。

map中的键通常是唯一的(至少在std::map中是)。但映射的不同之处在于它们对存储键排序的方法。例如,std::map基于平衡二叉树,其平均复杂度为检索给定键等于O(ln(n)),其中n是映射中的一些元素。或者std::unordered_map内部是一个hashmap,平均访问时间= O(1)。也就是说,它在常量时间内查找一个键,而不管里面有多少个元素。

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

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

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

如果你还有其他问题,请提出来。当然,一个好问题的前提是你已经学习了这门学科,现在遇到了一个你自己无法解决的问题

答案是否定的原因有很多。最简单的两个是:

  1. map是一种以已经排序的形式存储数据的结构。你的数据还没有排序,所以它根本不是一个地图。

  2. map类有自己的内部数据结构,用来存储map。除非你的文件完美地复制了这个内部结构(这几乎肯定是不可能的,因为它很可能包含指向内存的指针),否则map类会误解文件中的数据。

How did u serialize the data to the file?
Assuming that you serialized a struct consisting of maps, you'd de-serialize as below:
FileAsMap* fileAsMap = reinterpret_cast<FileAsMap*>(mmappedData);
Gives access to entire structure (blob).
(*fileAsMap).keyValueMap gives access to map.