我可以将键值对的内存映射文件重新解释为映射以便对它们进行排序吗?
Can I reinterpret a memory mapped file of key-value pairs as a map in order to sort them?
我有一个包含键值对的内存映射文件。键和值都是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)
。我想最简单的实现只需要一个屏幕的代码。
但是要注意:顺序扫描是一个相对昂贵的操作,所以如果文件中有足够的元素,它可能会变得不可接受的慢。在这种情况下,您需要一些优化的索引。例如,在处理开始时读取所有键,并构建索引数组。但是所有这些问题都很大程度上取决于任务的细节,所以最好现在就停止解释。
如果你还有其他问题,请提出来。当然,一个好问题的前提是你已经学习了这门学科,现在遇到了一个你自己无法解决的问题
答案是否定的原因有很多。最简单的两个是:
-
map是一种以已经排序的形式存储数据的结构。你的数据还没有排序,所以它根本不是一个地图。
-
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.
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- 如何按值对无序哈希映射进行排序
- 从映射<字符串、矢量中对唯一值进行排序<string>>
- 映射C++按值排序和插入元素
- 使用按插入方式排序的参数创建哈希映射
- 为什么内置排序无法对向量映射进行排序
- 根据类成员对同一密钥的多映射元素进行排序
- 以std::字符串作为关键字,按字典顺序对一个无序映射进行排序
- 使用原子指令确保映射访问安全,是否可以使用两个不同的原子对指令进行重新排序
- 通过多个键和存储映射对大量向量进行排序
- 对键进行排序后,按值对多映射进行排序
- 字节不符合记忆映射和对文件进行排序
- 排序标准::映射<字符串,双精度>
- STL映射排序
- 将C++内存排序映射到Java
- 对一个无序映射c++进行排序时数据丢失
- 映射结构也支持排序
- 自定义排序和映射时,首选函数指针或函数对象
- 排序值C++映射具有多个键值的数据结构
- std::将排序谓词映射到按字符串大小排序,但保留不同的字符串