Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QHash存储大量数据_C++_Qt_Qmap_Qhash - Fatal编程技术网

C++ QHash存储大量数据

C++ QHash存储大量数据,c++,qt,qmap,qhash,C++,Qt,Qmap,Qhash,我有10000000个struct{int,int,int,int}类型的条目。当我使用or存储它们时,它会占用大量内存,实际上需要大约 10,000,000 * 4 * 4 (sizeof integer) <= 153 MB 10000000*4*4(sizeof integer)您在评论中说,您正在使用另外四个整数作为键-这些值也必须保存,因此您实际上存储的是8个整数,而不是4个整数。除此之外,QHash必须存储哈希值,以便根据密钥高效地查找值。散列是一个无符号整数,因此有9个值,

我有10000000个struct{int,int,int,int}类型的条目。当我使用or存储它们时,它会占用大量内存,实际上需要大约

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

10000000*4*4(sizeof integer)您在评论中说,您正在使用另外四个整数作为键-这些值也必须保存,因此您实际上存储的是8个整数,而不是4个整数。除此之外,QHash必须存储哈希值,以便根据密钥高效地查找值。散列是一个无符号整数,因此有9个值,每个值的长度为4字节。总计约350MB

此外,内部QHashQMap可以在其元素之间使用一些填充,例如满足以下条件。填充是一个1字节的乘法器,这意味着在有10个mln元素的情况下,我们可能会得到至少几十个额外的兆字节

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

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

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

QHash
QMap
是关联容器:猜测您的4-int结构就是存储的值,键的类型是什么?@wasthis有帮助的键是其他四个整数,我使用QtPrivate::QHashCombine for qhash()存储它们。如果是序列数组,则可能接近153MB,但映射有额外的数据结构开销和堆分配开销。但应该不会太多。你如何衡量内存消耗?如何添加元素?尝试使用:yourqhash.reserve(maxsize);在添加元素之前,看看会发生什么。是的,随着容器中项目数量的增加,内存保留策略非常“慷慨”。它们是成比例的,不会随着项目数量的增加而缩小。与其使用挤压,不如使用reserve,因为他知道元素的数量。如果调用reserve()然后插入元素,则在插入过程中实现可以自由地保留更多空间,因此您可能最终会调用squence()最后,我只是想确定一下。