询问有关数据结构用法的建议

时间:2011-04-26 17:07:37

标签: c++ data-structures

对于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。我找到了:

  1. 设置相互链接的两张地图后的总内存使用量:498.7M。

  2. 没有设置从data2到data1的链接(不填充list <int> src_id),内存使用量:392.7M。

  3. 没有填充map_1,数据2中没有填充list <int> src_id,内存使用情况:182.0M

  4. 如果没有填充map_1,请使用data1的内容填充list <int> src_id,内存使用情况:289.7M

  5. 没有填充地图m_to_data2,内存使用情况:290.0M

  6. map_1的大小:77737

  7. map_2的大小:1830009

  8. map_1的每个元素的map<string, float> m_to_data2的大小,范围为3 - 17522

  9. map_2的每个元素的list <int> src_id大小,范围为1- 1377

  10. 我需要在设置相互链接的地图后减少内存使用量(理想情况下小于200M,目前为498M,如上所示)。我试图通过设置额外的map <string, int>来将字符串(data2的关键字)标记为int,因为int需要的内存少于字符串,但它可能没什么用,因为我需要{{1}的额外内存}。有什么建议吗?

    非常感谢您的意见/建议。

3 个答案:

答案 0 :(得分:1)

我将从以下开始:

  • 如果可能(即您有提升或tr1可用且排序不重要),请将所有map更改为unordered_map s。
  • 如果可能,请将list中的data2更改为vector
  • 有一个unordered_mapstring映射到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;

这将使您的代码更容易理解并继续优化。