我對XSLT非常陌生,我需要做的第一件事就是解析一個300MB的文件(這在小端)。 XSLT目前並不複雜,它只是刪除一些符合特定條件的節點。 我有兩個問題:XslCompiledTransform是否應歸咎於大型文件的慢速XML轉換?
- 它太慢了。處理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
此刻我想剛纔讀的文件,並將其寫回但它似乎實際上是將整個文件讀入內存,所以我試圖找到一種逐行讀取它的方法。
你可以發佈你的XSLT嗎? – 2010-01-07 01:33:49
另外,發佈您用於調用轉換的代碼。還要突出顯示需要50秒的代碼行。 – 2010-01-07 01:37:07
需要多長時間*)讀取源文件和*)使用*)File.ReadAllBytes/WriteAllBytes和*)file.ReadAllText/WriteAllText編寫文件的副本,以及什麼執行時間會「足夠快」? – devio 2010-01-07 01:58:09