我有10,000,000个类型为struct {int,int,int,int}的条目。当我使用QHashQMap存储它们时,它占用大量内存,实际上它必须占用大约

10,000,000 * 4 * 4 (sizeof integer) <= 153 MB

但是当我加载数据时,QHash和QMap都需要大约1.2 GB,为什么会发生这种情况以及如何针对速度和内存进行优化?(通过任何其他数据结构或qmap和qhash的一些技巧)

最佳答案

您在评论中说过,您正在使用另外四个int作为键-这些值也必须保存,因此您实际上存储的是8个int,而不是4。此外,QHash还必须将hash的值存储到根据键有效地查找值。哈希是一个无符号整数,因此您有9个值,每个值4个字节长。总计约350 MB。

同样,内部 QHash QMap 可能在其元素之间使用一些填充,例如以满足data structure alignment requirements。填充是1字节的乘数,这意味着在1000万个元素的情况下,我们可能会得到至少数十个额外的兆字节。

此外, QHash QMap 不仅是原始数据-它们都使用指向其内部数据结构的其他指针等,这是单个条目占用比您预期更多的空间的另一个原因。

数据大小膨胀的另一个原因可能是由于效率原因,这些类可能会存储一些其他值,以便在调用某些方法时可以对其进行预先计算。

最后但并非最不重要的一点是,出于效率考虑(避免不必要的复制), QHash 在任何给定时刻保留的内存超过其当前元素所需的内存。我希望大小越大,以防万一,因为复制会变得更昂贵,所以它将保留更多的内存。
您可以通过调用 Capacity()方法来预先检查保留的内存。如果要限制保留的内存量,请调用 squeeze()方法来调整内存,以使其足以容纳当前存储的元素。

10-08 11:40