2

457379行のテキストファイルとこの構造があります

Key1\t\tValue1
Key2\t\tValue2

このコードを使用して、Dictionary<string,string>

private void StartScan()
{
    using (StreamReader sr = new StreamReader("fh.txt"))
    {
        while (!sr.EndOfStream)
        {
            scaned++;
            label4.Text = scaned.ToString();
            var read = sr.ReadLine().Split(new string[] { "\t\t" }, StringSplitOptions.None);
            fh.Add(read[0], read[1]);
        }
    }
}

ただし、データのロードには 6 分以上かかります。

問題は、データをロードするためのより良い解決策はありますか?

4

4 に答える 4

2

label4問題は、行を読むたびにUI 要素 ( ) を更新していることです。

これは非常にコストがかかる可能性があるため、次の行を削除することをお勧めします。

label4.Text = scaned.ToString();

または、あまり頻繁に更新しないでください (たとえば、100 行が読み取られるたびに 1 回)。

于 2013-11-07T08:27:16.210 に答える
1

試す:

    private void StartScan()
    {
       var lastupdate = 0;

       ...

       if(lastUpdate + 100 < scaned) 
       { 
          label4.Text = scaned.ToString();
          lastUpdate = scaned;
       }
       ...

かなり改善される可能性があります...ラベルの更新は、コードで最も高価な操作の1つであると思います

于 2013-11-07T08:22:01.100 に答える
0

File.ReadLinesファイルを行ごとに処理する最も簡単で速い方法は次のとおりです。

var dictionary = File.ReadLines("C:\\file.txt")
                     .Select(s => s.Split(new string[] { "\t\t" }, StringSplitOptions.None))
                     .ToDictionary(k => k[0], v => v[1]);

そうは言っても、上記のコードと既に持っているものとの間に機能的な違いはほとんどありませんが、少し冗長であるという事実を除けば.

于 2013-11-07T08:10:03.863 に答える
0

できることの 1 つは、bufferstream を使用することです。

 using (FileStream fs = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
 using (BufferedStream bs = new BufferedStream(fs))
 using (StreamReader sr = new StreamReader(bs))
     {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            //Do the add
        }
     }

改善が見られます。また、辞書は必要ですか?各値へのキー マッピングが必要ない場合は、HashSet を使用します。加算の方が少し速いです。ほんの少しですが、長期的には違いを生む可能性があります。

于 2013-11-07T08:16:08.650 に答える