对于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,数据2中没有填充list <int> src_id
,内存使用情况:182.0M
如果没有填充map_1,请使用data1的内容填充list <int> src_id
,内存使用情况:289.7M
没有填充地图m_to_data2,内存使用情况:290.0M
map_1的大小:77737
map_2的大小:1830009
map_1的每个元素的map<string, float>
m_to_data2的大小,范围为3 - 17522
map_2的每个元素的list <int> src_id
大小,范围为1- 1377
我需要在设置相互链接的地图后减少内存使用量(理想情况下小于200M,目前为498M,如上所示)。我试图通过设置额外的map <string, int>
来将字符串(data2的关键字)标记为int,因为int需要的内存少于字符串,但它可能没什么用,因为我需要{{1}的额外内存}。有什么建议吗?
非常感谢您的意见/建议。
答案 0 :(得分:1)
我将从以下开始:
map
更改为unordered_map
s。list
中的data2
更改为vector
。unordered_map
从string
映射到unsigned
id
,并在您当前使用字符串的任何地方使用id
。鉴于m_to_data2
的大小范围为3-17k,您复制的名称很多。答案 1 :(得分:0)
看起来浮点引用变量占用太多内存可能是你可以将它改为unsigned int。
答案 2 :(得分:0)
如果我正确理解你的问题,我宁愿使用std :: multimap而不是std :: map
std::multimap<std::string, int> map2;
std::multimap<int, std::map<std::string, float> > map1;
这将使您的代码更容易理解并继续优化。