【问题标题】:Size of Qt containers: is QMap much larger than Qlist?Qt 容器的大小:QMap 是否比 Qlist 大得多?
【发布时间】:2013-05-13 18:09:14
【问题描述】:


我正在开发一个在 3D 空间中映射信息的软件。我使用一个容器来保存这些信息。我使用的容器是

 QList< QList< QMap<float, QList<quint16> > > > lidardata;

基本上是一个二维网格,表示一个矩形区域,其中每个单元格为 1 米 x 1 米,并且在每个单元格中,QMap 包含一个表示高度的键值和四个相关值的列表那个高度。这样我可以存储五个值(高度+其他值)。我在这样的循环中插入值(rowncoln 分别是行和列索引)

QList<quint16> NEWLIST;

NEWLIST << (width*100.0) << (1000.0+sens*100.0) << (quint16)(intensity*1000.0) ;

lidardata[ rown ][ coln ].insert( heightValue, NEWLIST);

在这种方法之前,我没有使用QMap&lt;float, QList&lt;quint16&gt;,而是使用了QList&lt;quint16&gt;,并且只是附加了5个值。
现在的问题是:运行我的程序很快就会耗尽内存。第一个解决方案(QList 而不是 QMap)占用了大约 800Mb 的内存,现在它在整个数据存储过程的 75% 处耗尽(大约 1.4 Gb)。
有人可以确认使用QMap&lt;float, QList&lt;quint16&gt; 而不是QList&lt;quint16&gt; 存储相同数量的信息确实需要更多的内存空间吗?

有没有人有任何限制空间的提示?如果没有任何问题,我会回到旧的解决方案。

【问题讨论】:

  • 你有什么理由首先使用这么多列表和地图吗?如果你想用数据表示一个单元格,为什么不创建一个带有 xpos / ypos 成员变量的单元格类,并有一个高度图数据的对象变量呢?然后只需使用一个单元格项目列表。这将比列表中的列表快得多,并且占用更少的内存。
  • 这很有帮助,嵌套的 QLists 真的没有必要。我保留了我的地图并使用了一个类来保存一维 QMaps 数组,这只是我的二维空间的连续表示,其中二维中的位置由 [rowNumber * rowTotNumber + colNumber] 引用。我的数据仍然很大,唯一的解决方案是找到基于磁盘的容器。谢谢!

标签: qt size containers qmap


【解决方案1】:

正如评论中提到的:

你的代码可能会受到Primitive Obsession.的影响

尝试使用本教程中所述的 ValueObject 修复来解决您的问题:创建一个具有所有需要的属性的类,并处理该类的实例,而不是维护嵌套的 Qlists 和 QMaps。

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多