c++ - QHash存储大量数据

标签 c++ qt qmap 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 可能会在其元素之间使用一些填充,例如满足 data structure alignment requirements 。填充是 1 字节的乘数,这意味着如果有 1000 万个元素,我们可能会至少获得几十兆字节的额外空间。

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

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

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

关于c++ - QHash存储大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44023855/

相关文章:

c++ - Vulkan 计算着色器不会在无限循环上停止

c++ - QSqlQuery 行影响结果

c++ - 在 Qt 中使用鼠标事件裁剪 QImage

c++ - 更改 QTableView 中列的顺序

C++将临时文件作为bash脚本执行

c++ - 如何找到元组 vector 中的最大值?

c++ - 通用统一初始化 : `double` to `int`

c++ - QMap 但没有按键排序

c++ - map - 找到最近的值?