【发布时间】:2010-01-06 21:57:06
【问题描述】:
我是 XSLT 的新手,我需要做的第一件事是解析一个 300MB 的文件(这只是小端)。 XSLT 目前并不复杂,它只是删除了一些符合特定条件的节点。 我有两个问题:
- 太慢了。处理 500,000 条记录需要 50 秒,这还不够快。
- 它消耗 500MB 的内存,所以当文件变大时,这种情况只会变得更糟。
我可以在 .net 中本地做些什么来提高性能?
我知道我可以研究基于 SAX 的解析或 STX(在 another post 中提到),但我更愿意留在 .net 范围内。
谢谢!
编辑: 这是我的 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:test="http://schemas....">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="test:QueryRow[test:Columns/test:QueryColumn[test:Name='hit_count' and test:Value>200]]"/>
</xsl:stylesheet>
这是我用来进行转换的代码
XslCompiledTransform compiledTransform = new XslCompiledTransform();
XsltSettings settings = new XsltSettings();
settings.EnableScript = true;
XmlReader xmlReader = XmlReader.Create("in.xml");
XmlWriter xmlWriter = XmlWriter.Create("out.xml");
compiledTransform.Load("format.xslt", settings, null);
compiledTransform.Transform(xmlReader, xmlWriter); //this is what takes a long time
目前我正在尝试读取文件并将其写回,但它似乎实际上是将整个文件读入内存,所以我试图找到一种逐行读取它的方法。
【问题讨论】:
-
另外,发布用于调用转换的代码。同时突出显示耗时 50 秒的代码行。
-
需要多长时间 *) 读取源文件并 *) 使用 *) File.ReadAllBytes / WriteAllBytes 和 *) file.ReadAllText / WriteAllText 写入文件副本,以及执行时间会“足够快”吗?