私は変数を持っています
StreamReader DebugInfo = GetDebugInfo();
var text = DebugInfo.ReadToEnd(); // takes 10 seconds!!! because there are a lot of students
テキストが等しい:
<student>
<firstName>Antonio</firstName>
<lastName>Namnum</lastName>
</student>
<student>
<firstName>Alicia</firstName>
<lastName>Garcia</lastName>
</student>
<student>
<firstName>Christina</firstName>
<lastName>SomeLattName</lastName>
</student>
... etc
.... many more students
私が今していることは次のとおりです。
StreamReader DebugInfo = GetDebugInfo();
var text = DebugInfo.ReadToEnd(); // takes 10 seconds!!!
var mtch = Regex.Match(text , @"(?s)<student>.+?</student>");
// keep parsing the file while there are more students
while (mtch.Success)
{
AddStudent(mtch.Value); // parse text node into object and add it to corresponding node
mtch = mtch.NextMatch();
}
全体のプロセスには約 25 秒かかります。streamReader をテキスト ( var text = DebugInfo.ReadToEnd();
) に変換するには、10 秒かかります。残りの部分は約 15 秒かかります。2つのパートを同時にできると思っていたのに…
編集
私は次のようなものが欲しいです:
const int bufferSize = 1024;
var sb = new StringBuilder();
Task.Factory.StartNew(() =>
{
Char[] buffer = new Char[bufferSize];
int count = bufferSize;
using (StreamReader sr = GetUnparsedDebugInfo())
{
while (count > 0)
{
count = sr.Read(buffer, 0, bufferSize);
sb.Append(buffer, 0, count);
}
}
var m = sb.ToString();
});
Thread.Sleep(100);
// meanwhile string is being build start adding items
var mtch = Regex.Match(sb.ToString(), @"(?s)<student>.+?</student>");
// keep parsing the file while there are more nodes
while (mtch.Success)
{
AddStudent(mtch.Value);
mtch = mtch.NextMatch();
}
編集 2
概要
申し訳ありませんが、テキストはxmlに非常に似ていますが、そうではありません。そのため、正規表現を使用する必要があります...つまり、ストリームを文字列に変換してから文字列を解析しているため、時間を節約できると思います。ストリームを正規表現で解析してみませんか。または、それが不可能な場合は、ストリームのチャンクを取得して、そのチャンクを別のスレッドで解析してみませんか。