天道酬勤,学无止境

qhash

QHash存储大量数据(QHash storing large amount of data)

问题 我有 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 的一些技巧) 回答1 你在评论中说你使用另外四个整数作为键 - 这些值也必须保存,所以你实际上存储了 8 个整数,而不是 4 个。除此之外,QHash 必须将哈希值存储到有效地查找基于键的值。 散列是一个无符号整数,所以你有 9 个值,每个 4 个字节长。 它总计约 350 MB。 此外,内部QHash或QMap可能会在其元素之间使用一些填充,例如以满足数据结构对齐要求。 Padding 是 1 字节的乘数,这意味着在 1000 万个元素的情况下,我们可能至少会得到几十个额外的兆字节。 此外, QHash和QMap不仅仅是原始数据——它们都使用额外的指向其内部数据结构等的指针,这也是单个条目占用比您预期更多空间的另一个原因。 数据量膨胀的另一个原因可能是出于效率原因,这些类可能会存储一些额外的值,以便在调用它们的某些方法时预先计算它们。

2021-10-15 09:34:57    分类:技术分享    c++   qt   qmap   qhash

QHash storing large amount of data

I've 10,000,000 entry of type struct{int, int, int, int}. when I store them using QHash or QMap, it occupies large amount of memory, indeed it must take about 10,000,000 * 4 * 4 (sizeof integer) <= 153 MB but when I load my data it takes about 1.2 GB for both QHash and QMap, why this occurs and how can I optimize it for both speed and memory?(through any other data structure or some tricks to qmap and qhash)

2021-08-31 04:44:55    分类:问答    c++   qt   qmap   qhash

qvariant 作为 qhash 中的关键(qvariant as key in qhash)

问题 我想创建一个带有 QVariants 键的数据结构。 它看起来像这样: QHash<QPair<QVariant, QVariant>, SHAPES::Shape* > _shapes; 不幸的是,“没有匹配的函数来调用‘qHash(const QVariant&)’”。 所以我为 QVariants 定义了自己的 qHash 实现: #pragma once #include <QVariant> #include <QHash> uint qHash( const QVariant & var ) { if ( !var.isValid() || var.isNull() ) //return -1; Q_ASSERT(0); switch ( var.type() ) { case QVariant::Int: return qHash( var.toInt() ); break; case QVariant::UInt: return qHash( var.toUInt() ); break; case QVariant::Bool: return qHash( var.toUInt() ); break; case QVariant::Double: return qHash( var.toUInt() ); break; case QVariant

2021-08-11 15:23:44    分类:技术分享    qt   key   qvariant   qhash

qvariant as key in qhash

I want to create a data structure with QVariants a keys. It looks like this: QHash<QPair<QVariant, QVariant>, SHAPES::Shape* > _shapes; Unfortunately there is "no matching function for call to ‘qHash(const QVariant&)’". So I defined my own implementation of qHash for QVariants: #pragma once #include <QVariant> #include <QHash> uint qHash( const QVariant & var ) { if ( !var.isValid() || var.isNull() ) //return -1; Q_ASSERT(0); switch ( var.type() ) { case QVariant::Int: return qHash( var.toInt() ); break; case QVariant::UInt: return qHash( var.toUInt() ); break; case QVariant::Bool: return

2021-07-30 05:22:37    分类:问答    qt   key   qvariant   qhash

使用多个键实现类似 QHash 的查找(Implementing a QHash-like lookup with multiple keys)

问题 我试图找到实现使用多个键返回一个值的类似 QHash 的查找表的最佳方法。 我已经读到 Boost 库具有类似的功能,但我想尽可能避免这种情况。 我想做的一个例子如下(显然下面的伪代码是不可能的): //First key (int) - Engine cylinders //Second key (int) - Car weight //Value (int) - Top speed MyLookup<int, int, int> m_Lookup m_Lookup.insert(6, 1000, 210); m_Lookup.insert(6, 1500, 190); m_Lookup.value(6, 1000); //Returns 210 我的第一个(也是非常缓慢的)想法是创建一个 Struct,然后迭代一个列表,直到找到一个符合条件的项目。 Struct Vehicle { int cyl; int weight; int speed' } QList<Vehicle> carList; //Assume this is populated for(i = 0; i < carList.length; ++i) { if(carList[i].cyl == 6 && carList[i].weight == 1000) { return carList[i]

2021-07-10 09:27:13    分类:技术分享    qt   key   lookup   lookup-tables   qhash

Implementing a QHash-like lookup with multiple keys

I'm trying to find the best way to implement a QHash-like lookup table that uses multiple keys to return one value. I have read that the Boost library has similar functionality, but I would like to avoid this if possible. An example of what I would like to do is as follows (obviously the following pseudo-code is not possible): //First key (int) - Engine cylinders //Second key (int) - Car weight //Value (int) - Top speed MyLookup<int, int, int> m_Lookup m_Lookup.insert(6, 1000, 210); m_Lookup.insert(6, 1500, 190); m_Lookup.value(6, 1000); //Returns 210 My first (and extremely slow) idea was to

2021-06-22 21:06:33    分类:问答    qt   key   lookup   lookup-tables   qhash