【问题标题】:Need a way to optimize heap usage C - Freebsd/glibc需要一种优化堆使用的方法 C - Freebsd/glibc
【发布时间】:2013-12-30 11:52:12
【问题描述】:

我有一个读取外部 xml 文件、解析内容并创建列表的应用程序。 该文件不断被外部供应商更新。所以我对文件的条目/内容的数量没有任何控制。我的问题是我的应用程序正在使用大量内存,如 ps Aux 输出(RSS 列)所示。我追踪到这样一个事实,即在解析文件时,我的应用程序链接到 libxml2.so.3。

它用于解析xml文件,罪魁祸首函数的轮廓如下:

processxml_func() {

 1)  xmlReadFile(app_xml, NULL, 0); --> This internally allocated around 7MB of data and is a purely libxml call. So i have no control on its memory allocations.

然后编码到

 2)  parse the xml contents --> again using libxml calls and create the list(using malloc) . List has members like name(variable length), description (again variable length etc). This list is long living and needs to live until the program terminates.

 3) Free the memory allocated in 1.

processxml_func_end

使用 pmap 我跟踪到在调用 processxml_func 之后,我的程序堆内存增加了约 10 MB。通过 gdb 进行单次跟踪,我注意到:

step1: allocated 7MB --> usage of the heap is 7MB
step2: allocates 3 MB --> usage of the heap is 7+3 MB
step3: free memory in step1 --> usage is still 10MB

我觉得在 3 之后堆使用量仍然是 10MB 的原因是,在 2 期间,我们从 step1 中的碎片块/残余中为 step2 分配了一些内存,因此 即使在第 3 步之后,我们也无法释放整个 7MB。我注释掉了第2步并检查了 退出函数后堆使用量接近于零。

现在鉴于上述情况,我需要建议/调整以减少我的应用程序的堆占用空间。 我正在考虑的一种方法是为 processxml_func 创建一个新进程(fork),然后 使用 IPC 将列表转移到父进程(父进程中需要再次重建列表)并终止子进程。

只是想知道,a)是否有更好的方法来做这件事 b) 一些控制 malloc 行为的标志?

感谢您的宝贵时间。

我的环境: C语言/FreeBsd,/usr/lib/libc.so.6

【问题讨论】:

  • 您为什么担心?你的机器这么受限制吗?使用 VM,免费的 7Mb 块基本上没有成本。如果您真的需要担心,那么一个简单的解决方案是在解析之前为您的列表预先分配内存。
  • 你的机器这么受限制吗?是的,它是一种嵌入式环境,每个 MB 对我们来说都很重要,因为我们正试图加快进程等。我真的无法预先分配,因为我没有列表的大小(请注意关于列表依赖于外部的点因素)。
  • Srinivas:我关心 FreeBSD 和这个问题,如果你发现了一些有用的东西,请告诉我。谢谢。

标签: c memory heap-memory glibc


【解决方案1】:

一般的解决方案是不将完整的文件读入内存。相反,阅读一个块,提取你需要的东西,阅读更多,提取更多。您的 XML 解析器必须支持此模式。

谷歌搜索“流式 XML 解析器”会给出许多结果,这似乎表明这种情况并不少见。

附: 10MB 看起来几乎没有。我不会担心,除非文件预计会增长到 GB 区域。

【讨论】:

    【解决方案2】:

    迷你 XML (http://www.msweet.org/projects.php?Z3) 我向您推荐这个 xml 解析器,我在我的 docsis-NMS 应用程序(在 Debian 7.0 下)中使用这个 xml-lib 差不多 2 年了。我觉得它的文档很好,简单易学,API也很稳定。

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2016-04-12
      相关资源
      最近更新 更多