我有10,000,000类型的struct{int,int}条目。当我使用QHash或QMap存储它们时,它占用了大量的内存,实际上它必须占用
10,000,000 * 4 * 4 (sizeof integer) <= 153 MB但是,当我加载数据时,QHash和QMap都需要1.2GB左右的时间,为什么会发生这种情况,如何优化速度和内存?(通过任何其他数据结构或qmap和qhash的一些技巧)
发布于 2017-05-17 16:58:45
您在注释中说过,您正在使用另外四个in作为键--这些值也必须保存,因此您实际上要存储8个in,而不是4个。除此之外,QHash还必须存储哈希值,以便根据键高效地查找值。哈希是一个无符号整数,因此您有9个值,每个值有4个字节长。其总价值为350 MB。
此外,内部QHash或QMap可以在其元素之间使用一些填充,例如满足数据结构对齐要求。填充是一个1字节的乘法器,这意味着在10百万元素的情况下,我们至少可以得到--至少有几十个兆字节的。
此外,QHash和QMap不仅仅是原始数据--它们都使用指向内部数据结构等的额外指针,这也是单个条目占用空间比您预期的要多的另一个原因。
数据大小膨胀的另一个原因可能是,出于效率原因,这些类可能存储一些附加值,以便在调用它们的某些方法时预先计算它们。
最后但并非最不重要的一点是,QHash由于效率原因(避免不必要的复制)在任何给定时刻都保留了比当前元素更多的内存。我预计,越大的大小,它就会保留更多的内存,以防万一,因为复制变得更昂贵。您可以通过调用()方法来检查预先预留的内存。如果您想限制保留的内存量,请调用挤压()方法来裁剪内存量,这样它就足够包含当前存储的元素了。
https://stackoverflow.com/questions/44023855
复制相似问题