询问有关数据结构使用的建议
Ask for suggestion on a data structure usage
对于data1
中的每个元素,我需要找出data2
中与它相关的元素。此外,对于data2
中的每个元素,我需要找出data1中与它相关的元素。因此,我设置了一个相互的数据结构,如下所示:
01 class data1 {
02 // class variables
03 int id;
04 float d1_v1;
05 float d1_v2;
06 map<string, float> m_to_data2; // string is the keyword of data2, float recorded the reference info when data1 and data2 are related.
07 };
08
09 class data2 {
10 // class variables
11 int d2_v1;
float d2_v2;
12 list <int> src_id; // int is the id of data1
13 };
14
15 map<string, data2 *> map_2;
16 map<int, data1 *> map_1;
然后我解析文件并填充map_1和map_2。我发现:
建立相互链接的两个映射后的总内存使用量:498.7M.
未设置从data2到data1的链接(未填充
list <int> src_id
),内存占用:392.7M。不填充map_1,不填充
list <int> src_id
,内存占用:182.0M不填充map_1,用id号data1填充
list <int> src_id
,内存占用:289.7M没有填充映射m_to_data2,内存使用:290.0M
map_1: 77737的大小
map_2的大小:1830009
map<string, float>
m_to_data2在3 ~ 17522范围内的大小map_2在1 ~ 1377范围内的
list <int> src_id
的大小
我需要在设置相互链接的映射后减少内存使用(理想情况下小于200M,目前为498M,如上图所示)。我试图通过设置额外的map <string, int>
将字符串(data2的关键字)标记为int,因为int需要比string更少的内存,但它可能没有多大帮助,因为我需要额外的map <string, int>
内存。有什么建议吗?
我将从下面开始:
- 如果可能的话(例如,您有boost或tr1可用,排序并不重要),将所有
map
s更改为unordered_map
s。 - 如果可能,将
data2
中的list
改为vector
。 - 有一个
unordered_map
,从string
映射到unsigned
id
,并在你目前使用字符串的任何地方使用id
。考虑到m_to_data2
的大小范围为3-17k,您复制了许多名称。
看起来float引用变量占用了太多内存,您可以将其更改为unsigned int
如果我正确理解你的问题,我宁愿使用std::multimap而不是std::map
std::multimap<std::string, int> map2;
std::multimap<int, std::map<std::string, float> > map1;
,这将使您的代码更容易理解和继续优化。
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 带参数的数据结构的全局声明