私のC#アプリケーションは、次の構造のXMLファイルを読み込みます。 150MBファイルには約25万語があります。 に私が欲しい辞書にXML読み込みが遅くなる
<word>
<name>kick</name>
<id>485</id>
<rels>12:4;4256:3;754:3;1452:2;86:2;125:2;</rels>
</word>
辞書にXML-ファイルをお読みください。これらは私の読書クラスのいくつかのクラスメンバーです。
private XmlReader Reader;
public string CurrentWordName;
public int CurrentWordId;
public Dictionary<KeyValuePair<int, int>, int> CurrentRelations;
私の読書クラスの主な方法は次のとおりです。ファイルから次の単語を読み込み、name
,id
を取得し、その関係を辞書に格納します。
CurrentWordId = -1;
CurrentWordName = "";
CurrentRelations = new Dictionary<KeyValuePair<int, int>, int>();
while(Reader.Read())
if(Reader.NodeType == XmlNodeType.Element & Reader.Name == "word")
{
while (Reader.Read())
if (Reader.NodeType == XmlNodeType.Element & Reader.Name == "name")
{
XElement Title = XElement.ReadFrom(Reader) as XElement;
CurrentWordName = Title.Value;
break;
}
while (Reader.Read())
if (Reader.NodeType == XmlNodeType.Element & Reader.Name == "id")
{
XElement Identifier = XElement.ReadFrom(Reader) as XElement;
CurrentWordId = Convert.ToInt32(Identifier.Value);
break;
}
while(Reader.Read())
if (Reader.NodeType == XmlNodeType.Element & Reader.Name == "rels")
{
XElement Text = XElement.ReadFrom(Reader) as XElement;
string[] RelationStrings = Text.Value.Split(';');
foreach (string RelationString in RelationStrings)
{
string[] RelationsStringSplit = RelationString.Split(':');
if (RelationsStringSplit.Length == 2)
CurrentRelations.Add(new KeyValuePair<int,int>(CurrentWordId,Convert.ToInt32(RelationsStringSplit[0])), Convert.ToInt32(RelationsStringSplit[1]));
}
break;
}
break;
}
if (CurrentRelations.Count < 1 || CurrentWordId == -1 || CurrentWordName == "")
return false;
else
return true;
私のWindowsフォームは、すべての単語を読むことbackgroundWorker
を持っています。私をデバッグすることで
private void bgReader_DoWork(object sender, DoWorkEventArgs e)
{
ReadXML Reader = new ReadXML(tBOpenFile.Text);
Words = new Dictionary<int, string>();
Dictionary<KeyValuePair<int, int>, int> ReadedRelations = new Dictionary<KeyValuePair<int, int>, int>();
// reading
while(Reader.ReadNextWord())
{
Words.Add(Reader.CurrentWordId, Reader.CurrentWordName);
foreach (KeyValuePair<KeyValuePair<int, int>, int> CurrentRelation in Reader.CurrentRelations)
{
ReadedRelations.Add(new KeyValuePair<int, int>(CurrentRelation.Key.Key, CurrentRelation.Key.Value), CurrentRelation.Value);
}
}
はアプリケーションが本当に高速で開始し、時間で遅くなることに気づきました。最初20万の言葉私は、この動作を説明することはできません最初22万言葉
ため
- 7秒!しかし、私は、XMLファイル内の単語が平均で同じサイズであることを確信しています。多分
Add()
- 方法は辞書の長さによって遅くなります。アプリケーションを高速化するにはどうすればよいですか?
代わりにノードによってノードを読み取るXML – Lloyd
へのLINQを見て多分それは '辞書<持つように助けることができますint、Dictionary> 'を使用し、ダブルキーを使用して1回ではなく2回インデックスを作成します。データによって異なります。 –
harold
@Lloyd、どのようにパフォーマンスを向上させるのに役立ちますか? – svick