QHash 存储大量数据



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

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新