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 行一次。

于 2013-11-07T08:27:16.210 回答
1

尝试:

    private void StartScan()
    {
       var lastupdate = 0;

       ...

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

它可能会改进很多...我猜标签更新是代码中最昂贵的操作之一

于 2013-11-07T08:22:01.100 回答
0

您可以做的一件事是使用缓冲流。

 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 回答
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 回答