4

私はたくさん検索しましたが、私の問題に対する適切な解決策を見つけることができませんでした。テレビ番組のすべてのエピソード情報を含む xml ファイルを作成しました。これは 38 kb で、約 680 の変数の属性と文字列が含まれています。最初は、クアッドコアで問題なく動作する XMLTextReader の助けを借りて単純に読みました。しかし、私の妻の 5 年前のラップトップは、それを読むのに約 30 秒かかりました。そのため、マルチスレッドについて考えましたが、ファイルが既に開かれているため、例外が発生します。

スレッドの開始は次のようになります

while (reader.Read())
{
   ...
   else if (reader.NodeType == XmlNodeType.Element)
   {
       if (reader.Name.Equals("Season1"))
       {
           current.seasonNr = 0;
           current.currentSeason = season[0];
           current.reader = reader;
           seasonThread[0].Start(current);
       }
       else if (reader.Name.Equals("Season2"))
       {
           current.seasonNr = 1;
           current.currentSeason = season[1];
           current.reader = reader;
           seasonThread[1].Start(current);
       }

そして、このような解析方法

reader.Read();

for (episodeNr = 0; episodeNr < tmp.currentSeason.episode.Length; episodeNr++)
{
    reader.MoveToFirstAttribute();
    tmp.currentSeason.episode[episodeNr].id = reader.ReadContentAsInt();
    ...
}

しかし、うまくいきません...

「カーソル」を正しい位置に配置したいので、リーダーを渡します。しかし、これがまったく機能するかどうかもわかりません。

助けてください!

編集: みんな、IEについてどこに書いたの?? 私が書いたプログラムはファイルを解析します。PCとラップトップで実行します。IEはまったくありません。

EDIT2: 私はいくつかのストップウォッチの調査を行い、xml ファイルの解析には、私の PC では約 200 ミリ秒、妻のラップトップでは 800 ミリ秒しかかからないことがわかりました。WPFはとても遅いですか?私に何ができる?

4

4 に答える 4

3

私はほとんどの皆さんのコメントに同意します。38Kb ファイルの読み取りには、それほど時間がかかりません。処理に干渉している可能性のある、ウイルス対策など、マシンで実行されている他の何かがありますか?

スレッドの作成にかかる時間は、ファイルの読み取りにかかる時間よりもはるかに長くなります。ファイルとファイル自体の読み取りに使用される実際のコードを投稿できれば、パフォーマンスのボトルネックの分析に役立つ可能性があります。

于 2011-06-25T19:21:39.650 に答える
1

複数のスレッドで XML を解析することはできないと思います。少なくとも、パフォーマンス上の利点をもたらすような方法ではできません。ファイルのあるポイントから読み取るには、その前にあるすべてのことを知る必要があるためです。あなたがどのレベルにいるのか。

あなたのコードは、titが機能した場合、次のようになります。

main  season1  season2

read
read
skip   read
skip   read
read
skip             read
skip             read

「スキップ」を行うには、XML を完全に解析する必要があることに注意してください。つまり、メイン スレッドで以前と同じ量の作業を行うことになります。唯一の違いは、バックグラウンド スレッドで追加の作業を行っていることです。

遅さに関しては、このような小さな XML ファイルを解析するだけでも非常に高速になるはずです。遅い場合は、何か他の処理が遅いか、ファイルを複数回解析している可能性があります。

于 2011-06-25T18:42:22.040 に答える
0

同じデータを含むが個別に解析する必要があるノード名 (Season1、Season2) があるように見えるため、XML スキーマは並列処理に適していません。スキーマを再設計して、同じノード名 (つまりSeason) とデータの違いを表す属性 (つまりNumberシーズン番号を示す) を持つことができます。次に、Linq to XML および PLinq を使用して並列化できます。

XDocument doc = XDocument.Load(@"TVShowSeasons.xml");
var seasonData = doc.Descendants("Season")
                    .AsParallel()
                    .Select(x => new Season()
                    {
                        Number = (int)x.Attribute("Number"),
                        Descripton = x.Value
                    }).ToList();
于 2011-06-25T18:53:15.170 に答える
0

.xml ファイルがどのように使用されているかを理解していれば、基本的に .xml データベースを作成したことになります。

正しければ、インデックス付きの .xml ドキュメントを使用して、Xml を別の .xml ファイルに分割することをお勧めします。次に、Linq-2-Xml を使用して、特定の .xml ソースからの .xml データのセットをクエリできると思います。

もちろん、これは .xml ファイルをロードする必要があることを意味します。ただし、非常に小さいファイルをロードすることになり、 .xml ドキュメント オブジェクトを非同期的にロードすることはできますが、あまりお勧めできません。

于 2011-06-25T18:37:51.893 に答える