我可以将键值对的内存映射文件重新解释为映射以便对它们进行排序吗?
Can I reinterpret a memory mapped file of key-value pairs as a map in order to sort them?
我有一个包含键值对的内存映射文件。 key和value都是uint32_t,所有的key和value都以二进制形式存储在文件中,key紧接着value。该文件仅包含这些对,没有分隔符。
我希望能够通过递增键对所有这些键值对进行排序。
我的代码中编译了以下内容:
struct FileAsMap { map<uint32_t, uint32_t> keyValueMap; };
const FileAsMap* fileAsMap = reinterpret_cast<FileAsMap*>(mmappedData);
但我真的不知道从这里该做什么,因为根据定义,地图容器通过键保持对对的严格弱排序。如果我只是将映射文件重新解释为地图,我怎样才能让这些对排序?
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.
这不是答案,但解释不符合评论限制。
映射中的键通常是唯一的(至少在 std::map 中是这样)。但是地图通常在对存储的键进行排序的方法上各不相同。例如 std::map 基于平衡二叉树,检索给定键的平均复杂度等于 O(ln(n))
,其中 n
是映射中的元素数量。或者例如std::unordered_map
是内部的哈希图,平均访问时间 = O(1)。也就是说,无论内部元素的数量如何,它都会在恒定时间内寻找一个键。
在任何情况下,所有这些数据容器都需要专用的内部内存结构,这实际上看起来不像是简单的键值对流。这就是为什么我在上面的第一条评论中告诉我,几乎不可能重用其中一个标准地图作为 mmap 数据的方便数据访问器 w/o 在读取和解压缩数据流之前。
但是您可以创建自己的类地图 class,它将遍历 mmap 区域中的数据,并在存储的密钥与请求的密钥匹配时检查其 operator[](size_t i)
。我想最简单的实现只需要一屏代码。
但要注意:顺序扫描是一个相对昂贵的操作,所以如果文件中有 足够 个元素,它可能会变得无法接受的慢。在这种情况下,您需要一些优化的索引。例如,在处理开始时读取所有键并构建索引数组。但是所有这些问题都很大程度上取决于任务细节,所以现在最好停止解释。
如果您有任何其他问题,请随时提出。当然,一个好问题假设你已经研究过这个主题,现在遇到了一个你自己无法解决的特定问题f
答案是否定的原因有很多。最简单的两个是:
映射是一种以已排序的形式存储数据的结构。您的数据尚未排序,因此它根本不是地图。
地图 class 有自己的内部数据结构,用于存储地图。除非你的文件完美地复制了这个内部结构(它几乎肯定不能,因为它可能包含指向内存的指针)映射 class 会误解文件中的数据。
我有一个包含键值对的内存映射文件。 key和value都是uint32_t,所有的key和value都以二进制形式存储在文件中,key紧接着value。该文件仅包含这些对,没有分隔符。
我希望能够通过递增键对所有这些键值对进行排序。
我的代码中编译了以下内容:
struct FileAsMap { map<uint32_t, uint32_t> keyValueMap; };
const FileAsMap* fileAsMap = reinterpret_cast<FileAsMap*>(mmappedData);
但我真的不知道从这里该做什么,因为根据定义,地图容器通过键保持对对的严格弱排序。如果我只是将映射文件重新解释为地图,我怎样才能让这些对排序?
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.
这不是答案,但解释不符合评论限制。
映射中的键通常是唯一的(至少在 std::map 中是这样)。但是地图通常在对存储的键进行排序的方法上各不相同。例如 std::map 基于平衡二叉树,检索给定键的平均复杂度等于 O(ln(n))
,其中 n
是映射中的元素数量。或者例如std::unordered_map
是内部的哈希图,平均访问时间 = O(1)。也就是说,无论内部元素的数量如何,它都会在恒定时间内寻找一个键。
在任何情况下,所有这些数据容器都需要专用的内部内存结构,这实际上看起来不像是简单的键值对流。这就是为什么我在上面的第一条评论中告诉我,几乎不可能重用其中一个标准地图作为 mmap 数据的方便数据访问器 w/o 在读取和解压缩数据流之前。
但是您可以创建自己的类地图 class,它将遍历 mmap 区域中的数据,并在存储的密钥与请求的密钥匹配时检查其 operator[](size_t i)
。我想最简单的实现只需要一屏代码。
但要注意:顺序扫描是一个相对昂贵的操作,所以如果文件中有 足够 个元素,它可能会变得无法接受的慢。在这种情况下,您需要一些优化的索引。例如,在处理开始时读取所有键并构建索引数组。但是所有这些问题都很大程度上取决于任务细节,所以现在最好停止解释。
如果您有任何其他问题,请随时提出。当然,一个好问题假设你已经研究过这个主题,现在遇到了一个你自己无法解决的特定问题f
答案是否定的原因有很多。最简单的两个是:
映射是一种以已排序的形式存储数据的结构。您的数据尚未排序,因此它根本不是地图。
地图 class 有自己的内部数据结构,用于存储地图。除非你的文件完美地复制了这个内部结构(它几乎肯定不能,因为它可能包含指向内存的指针)映射 class 会误解文件中的数据。