【问题标题】:Deserialized map's size increase in qt c++qt c ++中反序列化地图的大小增加
【发布时间】:2014-10-10 09:50:36
【问题描述】:

我已使用 QDataStream 序列化地图并将对象写入文件。

当我再次反序列化并将地图加载到内存时,序列化文件大小为1.5mb,内存消耗为300mb。我使用相同的 QDataStream 进行反序列化。

你能告诉我为什么反序列化写入磁盘文件的 1.5mb 序列化对象占用了 300mb 内存。

序列化:

QMap< QString, QSet< QString > >  myMap[100];
QSet<QString> mySet; // Assume it has some data in it.
QSet<QString> mySet1; // Assume it has some data in it.
MyMap.insert("a", mySet);
MyMap.insert("b", mySet1);
QFile f( strOutFile );
f.open(QIODevice::WriteOnly);
QDataStream streamOut( &f );
streamOut << myMap;

反序列化:

QFile f(StrInFile);
QMap< QString, QSet< QString > >  InMap[100];
QDataStream streamIn( f, QIODevice::ReadOnly );
streamIn >> InMap[index];

我已经使用 MEMORYSTATUSEX windows 库检查了内存消耗。 反序列化后消耗的内存为300mb。

感谢您的帮助。

【问题讨论】:

  • 问题是什么?您能否创建一个重现问题的简单应用程序?
  • 你如何衡量内存消耗??
  • 我已经更新了这个问题。谢谢!
  • 代码有问题。 MyMap 是什么?我没有看到它宣布。此外,您只是序列化一个指向 myMap 的指针(这就是堆栈数组标识符:一个指针),我无法理解您如何以这种方式获取 1.5MB 文件。但是,即使您已定义模板以重载 operator&lt;&lt; 以接受指向 myMap 类型的指针,您仍然只编写一个 100 个对象。当然,文件可能很容易比一组 100 个空对象小得多。跨度>
  • 在第二部分看到 index 表明你做的比你在这里写的要多,但我不能确定。

标签: c++ qt serialization qmap qdatastream


【解决方案1】:

代码有问题。 MyMap 是什么?我没有看到它宣布。此外,您只是在序列化一个指向 myMap 的指针(这就是堆栈数组标识符的含义:一个指针),我无法理解您如何以这种方式获取 1.5MB 文件。

但是,即使您已定义模板以重载 operator&lt;&lt; 或只是重载 operator&lt;&lt; 以接受指向 myMap 类型的指针(一开始的三倍类树),您仍然只编写一个对象100. 当然文件可能很容易比一组 100 个空对象小得多。

如果我看到你的更多解释,我会更新我的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2011-02-04
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多