QHash存储大量数据

时间:2017-05-17 11:40:59

标签: c++ qt qmap qhash

我有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的一些技巧)< / p>

1 个答案:

答案 0 :(得分:2)

你在评论中已经说过你正在使用另外四个整数作为关键 - 这些值也必须保存,所以你实际上存储了8个整数,而不是4.除此之外,QHash必须存储值哈希根据密钥有效地查找值。哈希是一个无符号整数,所以你有9个值,每个长4个字节。它总计约350 MB。

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

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

另一个膨胀数据大小的来源可能是这样的事实:出于效率原因,这些类可能存储一些额外的值,以便在调用它们的某些方法时预先计算它们。

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