.net - XmlDocument缓存内存使用

标签 .net xml caching xmldocument

我们发现在使用 XmlDocument 的 .NET Web 应用程序中内存使用率非常高。 一个小的 (~5MB) XML 文档被加载到 XmlDocument 对象中并存储在 HttpContext.Cache 中,以便在每次加载页面时轻松查询和 XSLT 转换。 XML 在磁盘上定期修改,因此缓存依赖于文件。

这样的应用程序似乎使用了数百兆字节的 RAM。

我已经尝试在每次请求开始时请求垃圾收集,这使 RAM 使用率大大降低,但我无法想象这是一个好习惯。

对于我们如何以更低的 RAM 使用量实现相同的目标,有没有人有任何建议?

最佳答案

我的两分钱。 . .

如果内存使用量根据 XML 文档的大小呈指数增长,我会担心。例如1mb XML 文件内存稳定在 10mb,2mb 稳定在 30mb,等等。

此外,考虑 XML 文件的成本与其说是字节大小,不如说是每个节点的成本。如果您的 5mb XML 文档说有两个数据节点,那么文档在内存中的表示不会比 5mb 大很多(实际上它可能要小得多,考虑到 XML 中的二进制数据将是它的两倍)内存)。

*如果您的 XML 文档是 utf-8,并且您有两个大文本节点,那么内存中的表示可能是 10mb(文本可以存储在 .net 字符串中,这是 Unicode,宽度是标准英语 UTF-8 文本宽度的两倍)。

如果 XML 文档由许多离散的字符串值组成,那么每个节点都是一个对象,每个节点名称都是一个对象,每个节点值都是一个对象。因此,假设引用是 4 个字节,那么(至少)每个节点额外 12 个字节。

现在,假设你有很多节点,假设你的节点名称+值的平均长度是 20 个字符,那么一个 5mb 文件的引用开销是 3mb,加上 utf-8 到 Unicode 可能额外的 100%转换,它需要 5MB + 5mb + 3mb(至少)= 13mb(至少)的 ram 来存储一个 5mb 的 XML 文件。 . .这还不包括因内存对齐而丢失的字节数,或用于存储每个字符串对象 ** 大小的额外字节数。

还要考虑到因为您正在缓存 XML 文档,所以所有这些对象都会立即成为第 2 代可收集对象,这基本上意味着 GC 将非常懒惰地遍历那么大的堆以查看它是什么可以收藏。

参见 Rico Mariani's When to call GC.Collect()适用于不仅可以调用 GC Collect,而且需要调用它的情况。

希望这会有所帮助,抱歉,如果我是在向合唱团宣讲内存大小的事情。

* 我不知道这是否真的如此,但如果不是,我会感到惊讶。
** 我假设 .net 字符串在字符串的实际字符之前/之后存储字符串的大小,这可能会显着增加内存中的表示形式,并且每个节点额外增加 4-8 个字节,每 20 字节节点名称/值的成本为 20 字节。这有效地增加了开销以匹配存储的数据的大小。

关于.net - XmlDocument缓存内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584199/

相关文章:

c++ - 用于在 C 或 C++ 中解析 XML 的跨 Linux 和 Windows 的通用 XML 库是什么?

java - 使用Distributed Cache分发小查找文件的最佳方法

caching - L1、L2 和 L3 缓存如何与多个并发运行的进程配合使用?

c# - 如何使用 {} 而不是 ; 自行设置属性?

c# - 使用 Visual C# (Dot Net Framework 4.0) 在 "Socket Programming"中需要帮助?

.net - F# 可以强制参数为 byte[8] 吗?

caching - 我应该使用 Redis 来缓存查询的响应吗?

.net - 对于 Windows 或 Linux 的 Paradox 表等数据库表,什么是好的选择?

python - 在Python中解析XML

java - 如何在spring中获取访问配置文件的路径