2

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

4

1 回答 1

2

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

此外,内部QHashQMap可能会在其元素之间使用一些填充,例如满足数据结构对齐要求。填充是 1 个字节的乘数,这意味着在 1000 万个元素的情况下,我们可能会得到至少几十个额外的兆字节。

此外,QHashQMap不仅仅是原始数据——它们都使用了指向其内部数据结构等的附加指针,这也是单个条目占用的空间超出预期的另一个原因。

数据量膨胀的另一个原因可能是出于效率原因,这些类可能会存储一些额外的值,以便在您调用它们的某些方法时预先计算它们。

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

于 2017-05-17T16:58:45.383 回答