我有一個很大(〜40mb)的XML數據集合,在許多文件中沒有很好地形成,因此我合併它們,添加一個根節點並加載所有xml在XmlDocument
。它基本上是3種不同類型的列表,可以用幾種不同的方式嵌套。本實施例中應顯示大多數情況下:單線程應用程序顯示競爭狀態,如行爲
<Root>
<A>
<A>
<A></A>
<A></A>
</A>
</A>
<A />
<B>
<A>
<A>
<A></A>
<A></A>
</A>
</A>
</B>
<C />
</Root>
林通過使用上一個XmlDocument
(//A
,//B
,//C
),所得到的節點集轉換爲數據表,並顯示一個XPath表達式中分離所有A,B和C的節點Datagridview中每個節點類型的所有節點的列表。這工作正常。
但現在我面臨一個更大的文件,只要我加載它,它只顯示我4行。然後我在實際的XmlDocument.SelectNodes
發生的行添加了一個斷點,並檢查了結果NodeSet
。它向我展示了大約25,000個條目。在繼續加載程序並且哎呦,我所有的25k行都顯示出來了。我試了一遍,我可以重現它。如果我手動跨越XmlDocument.SelectNodes,它就可以工作。如果我不打破那裏,它不會。我不會在我的應用程序中產生單個線程。
如何進一步調試?要找什麼?我已經經歷了多線程庫如jsch(ssh)的這種行爲,但我不明白爲什麼這應該發生在我的情況。
非常感謝!
// class XmlToDataTable:
private DataTable CreateTable(NamedXPath logType,
List<XmlColumn> columns,
ITableCreator tableCreator)
{
// I have to break here -->
XmlNodeList xmlNodeList = logFile.GetEntries(logType);
// <-- I have to break here
DataTable dataTable = tableCreator.CreateTableLayout(columns);
foreach (XmlNode xmlNode in xmlNodeList)
{
DataRow row = dataTable.NewRow();
tableCreator.PopulateRow(xmlNode, row, columns);
dataTable.Rows.Add(row);
}
return dataTable;
}
// class Logfile:
public XmlNodeList GetEntries(NamedXPath e)
{
return (_xmlDocument != null && _xmlDocument.HasChildNodes)
? _xmlDocument.SelectNodes(e.XPath)
: new XmlNullObjectNodeList();
}
// _xmlDocument gets loaded here after reading all xml fragments into a string
// (ugly, i know. the // ugly! comment reminds me about that ;))
private void CreateXmlDoc()
{
_xmlDocument = new XmlDocument();
_xmlDocument.LoadXml(OPEN_ROOT_ELEMENT + _xmlString +
CLOSE_ROOT_ELEMENT);
if (DataChanged != null)
DataChanged(this, new EventArgs());
}
// class NamedXPath:
public abstract class NamedXPath
{
private readonly String _name;
private readonly String _xPath;
protected NamedXPath(string name, string xPath)
{
_name = name;
_xPath = xPath;
}
public string Name
{
get { return _name; }
}
public string XPath
{
get { return _xPath; }
}
}
你可以發佈如何加載_xmlDocument?關於CreateTable的前言 – 2010-09-21 08:26:32
@Henk Holterman編輯我的文章。我讀取字符串中的所有XML,添加和 並調用XmlDocument.LoadXml(String s)。我知道這很慢,吃了記憶,一旦它起作用,它就會被分析和調整。 –
atamanroman
2010-09-21 08:37:18
乍一看,你有一個很奇怪的問題。但是還有什麼可能是相關的?空接收{}塊?背景工作者? – 2010-09-21 08:47:23