首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QHash存储大量数据

QHash存储大量数据
EN

Stack Overflow用户
提问于 2017-05-17 11:40:59
回答 1查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
10,000,000 * 4 * 4 (sizeof integer) <= 153 MB

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

EN

回答 1

Stack Overflow用户

发布于 2017-05-17 16:58:45

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

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

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

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

最后但并非最不重要的一点是,QHash由于效率原因(避免不必要的复制)在任何给定时刻都保留了比当前元素更多的内存。我预计,越大的大小,它就会保留更多的内存,以防万一,因为复制变得更昂贵。您可以通过调用()方法来检查预先预留的内存。如果您想限制保留的内存量,请调用挤压()方法来裁剪内存量,这样它就足够包含当前存储的元素了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44023855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档