【问题标题】:QDomDocument SetContent() crashQDomDocument SetContent() 崩溃
【发布时间】:2015-11-25 11:44:27
【问题描述】:

我正在使用带有 32 位 Visual Studio 2010 的 QT4.8。 我正在尝试在函数中更改 XML 文件的某些内容。函数的开头是这样的

QFile* myXmlFile;
QDomDocument myDom;
...
myDom.setContent(myXmlFile);

当 xml 文件小于 24 Mb 时,该函数可以正常工作。但是,当我的文件大于该文件时,程序会在上面的最后一行崩溃。我找到了similar question,但它说错误发生在 200Mb 之后,问题似乎有所不同。

我有 16 Gb 的内存,你几乎看不到内存使用的变化,所以这可能不是因为内存不足。

当我使用 try catch 块查看问题时,它说存在错误的分配异常。尽管计算机中有更多可用内存,但 QDomDocument 似乎无法分配超过 24 MB 的空间。我阅读了 QDomDocument 的 Qt 文档,但没有发现任何线索。

有没有办法让程序或 QDomDocument 对象使用更多内存,或者你认为这是一个不同的问题?

【问题讨论】:

  • 如果文件是 24MB 并不意味着分配的 RAM 将是 24MB 它可能会更多,除了你的 exe 文件可能有最大 HEAP 限制,我相信你可以从 Visual工作室..msdn.microsoft.com/en-us/library/f90ybzkh%28v=vs.120%29.aspx
  • 如果它立即崩溃或分配的内存非常大,则没有时间或没有机会查看 QDomDocument 的内存使用情况。另外:32bit默认只允许2GB...见stackoverflow.com/q/639540/3021018
  • 它不会立即压碎,实际上它会在该行等待相当长的时间才会压碎。
  • 如果您的 XML 包含许多小标签,则构建 dom 文档将花费更多时间,并且会消耗更多内存。 “相当长的时间”听起来像这样。
  • @Aaron 是的,它的小标签太多了。

标签: c++ qt memory heap-memory


【解决方案1】:

如果 XML 文件在磁​​盘上是 24MB,这并不意味着分配的 RAM 将是 24MB,它可能会更多。 无论如何,Windows EXE 文件可能有一个最大 HEAP 限制,可以从 Visual Studio 增加,see link..

【讨论】:

    【解决方案2】:

    我对 Marco 解决问题的建议有误。尽管在某些情况下增加堆可能会有所帮助,但是当您有太多小节点时,QDomDocument 可能会变得大至 2GB,这是它的限制。我想最好的方法是使用 XmlStream 读取器和写入器。

    【讨论】:

    • 或者你可以编译 64 位的可寻址 RAM 将增加到 8TB(应该足够了)
    • @Marco 限制与 RAM 无关,2 GB 是 QDomDocument 对象的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2021-05-14
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多