有没有办法根据XpathDocument的文件大小来估计创建xml实例所需的内存?
XpathDocument xdoc =新文件(XpathDocument);
如果内存下降到非常低的水平,有没有办法以编程方式停止创建XpathDocument的过程?
因为它将整个xml加载到内存中,所以最好提前知道xml是否太大。我发现当我用一个大的xml文件创建一个新的XpathDocument时,一个outofmemory异常永远不会被触发,但是这个过程慢得像爬行一样,只剩下5Mb的可用内存,任务管理器报告它没有响应。当存在584 Mb的ram时,这发生在266 Mb的xml文件中。我能够加载一个150Mb的文件,在18分钟内没有任何问题。
加载xml之后,我想使用XpathNavigator和XpathNodeIterator执行xpath查询。我使用的是.net 2.0,xp sp3。
发布于 2010-12-30 10:24:08
简而言之,不,您不能,除非在开始估计之前,您总是有类似的文件来收集静态数据。
由于标记、属性、前缀和名称空间字符串都是固定的,所以这在很大程度上取决于XML文件的结构,存储效率如何,与磁盘上文件的比率也取决于所使用的编码。
通常,.NET将任何字符串作为UTF16存储在内存中。因此,即使没有显著的结构开销(想象一个只有一个根标记和大量纯文本的XML文件),使用的UTF8源文件(或ASCII码或任何其他8位编码)所使用的内存仍然会加倍。因此,字符串编码是等式中的第一部分。
另一件事是在内存中构建了一个数据结构,以允许高效地遍历文档。通常,节点是通过引用构造并链接在一起的。因此,每个节点都会占用一定数量的内存;由于大多数非值数据都是引用,因此这里使用的内存也在很大程度上取决于体系结构(对于单个引用,64位系统使用的内存是32位系统的两倍)。因此,如果你有一个数据很少的非常复杂的文档(例如,一大堆不同的标签,只有很少的文本或属性值),你的内存使用量将比原始文档大小大得多,而且这也在很大程度上取决于你的应用程序所运行的架构。
如果您的文件具有很少的超长标记和属性名称,并且可能大量使用默认名称空间,则使用的内存也可能比磁盘上的文件少得多。
因此,假设一个任意的XML文件具有未知的编码、合理的数据量和复杂性,将很难得到可靠的估计。但是,如果您的XML文件在提到的点上总是相似的,那么您可以创建一些统计数据来获得一个因子,该因子可以为您的特定平台获得大致正确的比率。
但是,请注意,在任务管理器中查看“空闲内存”或谈论“非常低的内存级别”都是非常模糊的量化。虚拟内存、缓存、后台应用程序和服务等会影响有效的原始内存可用性。因此,.NET框架不能可靠地猜测它应该允许多少内存用于单个进程的性能,甚至在安全抛出OutOfMemoryException之前也是如此。因此,如果您遇到其中一个异常,您通常会超出应用程序的可能恢复点,并且您不应该尝试捕获和处理这些异常。
发布于 2010-12-30 09:54:43
你可以简单地检查文件大小,如果它超过了某个上限,就会退出。
var xmlFileInfo = new FileInfo(xmlfile);
var isTooBig = xmlFileInfo.Length > maximumSize这不是万无一失的,因为您无法猜测正确的最大大小。
发布于 2010-12-30 09:55:53
是的,当然你可以用FileInfo类来实现。
System.IO.FileInfo foo = new System.IO.FileInfo("<your file path as string>");
long Size = foo.Length;https://stackoverflow.com/questions/4559409
复制相似问题