【发布时间】:2011-04-26 17:07:37
【问题描述】:
对于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,用data1的id填充
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的范围内1-1377范围内map_2的每个元素
list <int> src_id的大小
我需要在设置相互链接的映射后减少内存使用量(理想情况下小于 200M,目前为 498M,如上所示)。我试图通过设置一个额外的map <string, int> 将字符串(data2 的关键字)标记为 int,因为 int 需要的内存比字符串少,但它可能没有多大帮助,因为我需要为map <string, int> 提供额外的内存。有什么建议吗?
我们非常感谢您的 cmets/建议。
【问题讨论】:
-
也许存储指向 data2 的指针而不是 m_to_data2 关键字的字符串?应该节省内存和 CPU 时间。
-
实际对象有多大(即
...中隐藏了什么?) ids 是连续的吗? (密集?稀疏?)您可以做的最简单的事情是将list更改为deque如果您不需要在中间插入删除(将避免每个对象 2 个指针)或vector如果可以最后只使用插入删除进行管理。您可以用哈希映射替换maps以减少内存占用,或者如果您可以重用 id 并使它们连续(并且基于 0),那么您可以通过使用vector(哈希映射对于某些特定情况具有完美的散列) -
(1) 指针需要与字符串相同的内存,对吧?在这种情况下如何节省内存?
-
...中没有重要的东西,只有两个 int 变量。这些可能不是减少内存的关键问题。
-
你真的应该在你的基础上工作,如果你不理解指针和字符串之间的区别,你将无法优化内存占用,不,它们不占用相同的空间.每个字符串都有自己的每个存储字符的副本(可能取决于编译器,它们可能使用写时复制语义)。
标签: c++ data-structures