- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 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。
此外,在内部 QHash 或 QMap 可能会在其元素之间使用一些填充,例如以满足 data structure alignment requirements .填充是 1 字节的乘数,这意味着如果有 1000 万个元素,我们可能会至少增加几十兆字节。
此外,QHash 和 QMap 不仅仅是原始数据——它们都使用额外的指针指向它们的内部数据结构等,这也是为什么单一条目的另一个原因会占用比您预期更多的空间。
数据大小膨胀的另一个来源可能是出于效率原因,这些类可能会存储一些额外的值,以便在您调用它们的某些方法时预先计算它们。
最后但同样重要的是,QHash 出于效率原因(避免不必要的复制)在任何给定时刻保留比其当前元素所需的更多内存。我希望大小越大,它会保留越多的内存以防万一,因为复制变得更加昂贵。您可以通过调用capacity()方法查看预先预留的内存。如果您想限制保留的内存量,请调用 squeeze() 方法来调整内存,使其刚好足以包含当前存储的元素。
关于c++ - QHash存储大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44023855/
在我的项目中,我需要几个常量哈希容器,它们在类和函数之外定义,因此是全局的。这样,其中一些容器应该重叠。对于列表,我将执行以下操作以将第二个 const 列表与第一个 const 列表组合: cons
我正在使用 QT 4.8,我注意到它有一个 QHash 类,可以按如下方式使用: QHash hash; hash["one"] = 1; hash["three"] = 3; has
我想从我的 QHash 中得到一个随机对,数字为 n。 现在我这样做: QHash::iterator iterator = dictionary.begin(); iterator+= n; que
我有一个 QHash ,而 MyClass 只是一些带有 getter 和 setter 的 QString quint8 值的集合。 MyClass 还有一个 QDataStream &operat
我一直在尝试并试图让它工作,但它就是拒绝工作。我阅读了 QT 文档,但无法使插入功能发挥作用。构建时出现以下复杂错误 /home/mmanley/projects/StreamDesk/libstre
我需要一个 QHash 容器,它采用 quint8 键,但采用异构类型作为值,所有这些都将是 Qt 容器或类。例如,我可能想插入一个 QDate 或 QTime 对象,甚至 quint8 作为值。 如
是否可以按插入顺序循环 QHash?下面的方法似乎通过一些其他因素循环散列: QHashIterator i(hash); while (i.hasNext()) { i.next();
我是 Qt 的新手,正在学习处理 QHash 的工作原理。在处理这个例子时,我不明白为什么这会给我一个错误。我可能会遗漏一些东西,但请指导我学习这一点。 主要.cpp int main(int arg
我试图找到实现使用多个键返回一个值的类似 QHash 的查找表的最佳方法。我已经读到 Boost 库具有类似的功能,但如果可能,我想避免这种情况。 我想做的一个例子如下(显然下面的伪代码是不可能的):
我想存储从一个类继承的 QHash 元素。所以我有: class ImageInterface { public: ImageInterface(); ImageInterface(c
我想使用 QSet自定义对象。从文档中,我发现: QSet's value data type must be an assignable data type. You cannot, for exa
我有一个QHash > qhash ,并尝试覆盖 QVector 中的值如下: void Coordinate::normalizeHashElements(QHash > qhash) {
我有一个服务器类,它处理 QJsonObject 数据并根据数据中设置的键来处理它。 目前,我使用一个很大的 if-then-else 语句来决定要做什么: const QString action
我有我的代码: for(QHash::iterator i=list.begin();i!=list.end();++i) { long id = QVariant((*i).key()).t
我正在尝试使用 QMutableHashIterator 遍历 QHash 并找到所有重复值,然后将每个重复值的键添加到 QStringList。我以前从未使用过 QHash,也不确定具体如何去做。在
我使用 QHash 作为容器,我有一个任务是删除所有满足谓词的项目。起初我想使用 Erase-remove idiom事实证明,QHash 没有删除范围的选项,只有一个 function。通过迭代器删
我在 C++ 中使用 QHash 来存储一些简单的键值对。在我的例子中,键是一个整数,值也是。要向散列添加新的键/值对,这是我的语法: QHash myhash; int key = 5; int v
我想创建一个 QSet我想在我的程序中使用。 Tag是我的自定义类。 当我构建代码时,我得到关于 qHash 的 gcc 错误重载: Exercise.cpp.o In file included f
我想创建一个带有 QVariants 键的数据结构。它看起来像这样: QHash, SHAPES::Shape* > _shapes; 不幸的是,“没有匹配的函数来调用‘qHash(const QVa
假设一个程序以相同的方式运行多次。在每次运行中,相同的一组对象以相同的插入顺序插入到 QHash 中;然后迭代 QHash 中的对象。问题是在程序的每次运行中对象是否会以相同的顺序迭代? 最佳答案 可
我是一名优秀的程序员,十分优秀!