对于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,在data2中没有填充list <int> src_id,内存使用:182.0M
  • 如果不填写map_1,请使用数据ID 1填充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比string需要更少的内存,但是由于我需要map <string, int>额外的内存,所以它可能没有太大帮助。有什么建议么?

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

    最佳答案

    我将从以下内容开始:

  • 如果可能(例如,您可以使用boost或tr1并且排序并不重要),请将所有map更改为unordered_map
  • 如果可能,请将list中的data2更改为vector
  • 有一个unordered_map,它从string映射到unsigned id,并在您当前使用字符串的任何地方使用该id。给定m_to_data2的大小范围为3-17k,您将重复很多名称。
  • 关于c++ - 征求有关数据结构用法的建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5793856/

    10-15 04:43