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

Ask for suggestion on a data structure usage

本文关键字:数据结构      更新时间:2023-10-16

对于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,不填充list <int> src_id,内存占用:182.0M

  4. 不填充map_1,用id号data1填充list <int> src_id,内存占用:289.7M

  5. 没有填充映射m_to_data2,内存使用:290.0M

  6. map_1: 77737的大小

  7. map_2的大小:1830009

  8. map<string, float> m_to_data2在3 ~ 17522范围内的大小

  9. 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;

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