- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序可以解析大约 50MB 的 XML 文件并将数据提取到内部对象结构中,而没有指向原始 XML 文件的链接。当我尝试粗略估计我需要多少内存时,我估计是 40MB。
但是我的程序需要大约 350MB,我试图找出会发生什么。我使用 boost::shared_ptr
,所以我没有处理原始指针,希望我没有产生内存泄漏。
我试着写下我所做的,我希望有人能指出我过程中的问题,错误的假设等等。
首先,我是如何衡量的?我使用 htop
发现我的内存已满,并且使用我的代码段的进程正在使用大部分内存。为了总结不同线程的内存并获得更漂亮的输出,我使用了 http://www.pixelbeat.org/scripts/ps_mem.py这证实了我的观察。
我粗略地估计了理论消耗,以了解哪个因素介于消耗和至少应该是多少之间。是10。所以我使用valgrind --tool=massif
来分析内存消耗。它表明,在 350MB 的峰值时,250MB 被称为 xml_allocator
的东西使用,它源于 pugixml
库。我转到我的代码部分,在那里我实例化了 pugi::xml_document
并将 std::cout
放入对象的析构函数以确认它已被释放在我的程序中很早就发生了(最后我睡了 20 秒,以便有足够的时间来测量内存消耗,即使在析构函数的控制台输出出现后内存消耗仍保持 350MB)。
现在我不知道如何解释它,希望有人能帮助我做出错误的假设或类似的事情。
使用 pugixml
的最外层代码片段类似于:
void parse( std::string filename, my_data_structure& struc )
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(filename.c_str());
for (pugi::xml_node node = doc.child("foo").child("bar"); node; node = node.next_sibling("bar"))
{
struc.hams.push_back( node.attribute("ham").value() );
}
}
并且由于在我的代码中我没有在某处存储 pugixml
元素(仅从中提取实际值),所以我希望 doc
期望在函数 parse
还剩下,但在图表上看,我无法判断发生这种情况的位置(在时间轴上)。
最佳答案
您的假设不正确。
以下是估算 pugixml 内存消耗的方法:
根据文档中节点/属性的密度,内存消耗范围可以从文档大小的 110%(即 50 Mb -> 55 Mb)到 600%(即 50 Mb -> 300 兆)。
当您销毁 pugixml 文档(调用 xml_document dtor)时,数据将被释放 - 然而,根据操作系统堆的行为方式,您可能不会立即看到它返回到系统 - 它可能会保留在进程堆中。验证您是否可以尝试再次进行解析并检查第二次解析后峰值内存是否相同。
关于c++ - 使用 pugixml 解释程序的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17963603/
我正在尝试使用 pugixml 修改 xml 配置,通过 boost::serialization 创建并由其他应用程序使用,因此我只需要更改文档的几个片段并保持所有其他部分相同。 一些节点可能以的形
我正在使用 pugixml 库来读取和写入 xml 文件。 如何将“克隆”深度复制到 pugixml 库中的 xml_document 对象? 最佳答案 这是最简单的选择: xml_document
我正在尝试编译这个项目:https://github.com/computationalpathologygroup/ASAP.git从源头。Pugixml 是一个依赖 我已经从源代码构建了 pugi
所以我有 2 个这样定义的静态库: 静态库1 // StaticLib1.h #pragma once class StaticLib1 { public: void doSomething1()
我有以下 XML: 我正在尝试使用 PugiXML
我的 XML 结构如下: John abcdef
我尝试使用 pugixml 将 .xml 文件读取到我的 C++ 程序中。问题是,即使是第一个示例也行不通。 我的 .xml 看起来像这样:
我在互联网上找到了 pugixml,它是一个非常好的库,尤其是它的格式(只是一个 header /源组合,没有 dll 依赖项)。我的问题是,我为我的引擎制作了一个格式,但我无法获得所有的 xml 节
如何删除 的子节点有子节点 具有属性 id不是以 it 开头 使用 PugiXML。结果如下:
我有点懵。 pugi::xml_node::value() 返回类型为 chart_t 的字符串,它可以是 wchar_t 或 char,具体取决于编译标志。在 pugiXML 的文档中说它适用于 u
我在 pugixml 中加载文档(参见链接 http://pastebin.com/FE3nDX9h)时遇到了一些问题。 我收到错误代码 16:No document element found 这表
pugixml 节点对象是否有子节点数方法?我在文档中找不到它,不得不使用迭代器,如下所示: int n = 0; for (pugi::xml_node ch_node = xMainNode.ch
我正在尝试压缩来自 pugi::xml_document 的数据。这是我试过的: template void save(const T &object, const QString &path) {
我正在使用 pugixml 来解析文件。我一直在使用 xml_tree_walker 并且我有一个变量我想在 walker 遍历 xml 时修改。我目前正在使用全局变量但不想使用。有没有办法通过引用将
我正在尝试使用 pugixml 从大型 XML 文件中提取数据。我只对节点 BAR 和 Nm 中的值的值感兴趣: FOOBAR222222
我正在编写我的应用程序的一部分,将设置存储在 XML 文件中,但我不想“客户端”复制,我想要这个: 但我得到的是:
我是 pugixml 的新手。考虑一下我给定了 XML here .我想获取每个学生的 Name 和 Roll 的值。下面的代码只找到标签而不是值。 #include #include "pugix
我刚刚下载了 pugixml 库,我正在努力使其适应我的需要。它主要面向我未使用的 DOM 样式。我存储的数据如下所示: 0
我有一个程序可以解析大约 50MB 的 XML 文件并将数据提取到内部对象结构中,而没有指向原始 XML 文件的链接。当我尝试粗略估计我需要多少内存时,我估计是 40MB。 但是我的程序需要大约 35
在pugixml pugi::xmlnode 类型是一个用于引用 XML 树的各个部分的对象。由于模糊地类似于指针,这些对象可以是null。 pugi 库经常返回空节点,但我如何自己创建一个? [更新
我是一名优秀的程序员,十分优秀!