Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将大文件加载到字典的最佳解决方案_C#_Linq_Dictionary - Fatal编程技术网

C# 将大文件加载到字典的最佳解决方案

C# 将大文件加载到字典的最佳解决方案,c#,linq,dictionary,C#,Linq,Dictionary,我有一个457379行的文本文件和这个结构 Key1\t\tValue1 Key2\t\tValue2 我正在使用此代码将其加载到词典中 但加载数据需要6分钟以上 问题是有没有更好的方法来加载数据?我发现文件。ReadLines是逐行处理文件的最简单/最快捷的方法: var dictionary = File.ReadLines("C:\\file.txt") .Select(s => s.Split(new string[] { "\t\t"

我有一个457379行的文本文件和这个结构

Key1\t\tValue1
Key2\t\tValue2
我正在使用此代码将其加载到
词典中

但加载数据需要6分钟以上


问题是有没有更好的方法来加载数据?

我发现
文件。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]);

话虽如此,上面的代码与您已有的代码在功能上没有多大区别,只是它的详细程度稍低。

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

 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
        }
     }
你会看到进步的。你还需要一本字典吗?如果不需要每个值的键映射,请使用哈希集。它的添加速度稍微快一点。只是一点点,但从长远来看可能会有所不同

试试看:

    private void StartScan()
    {
       var lastupdate = 0;

       ...

       if(lastUpdate + 100 < scaned) 
       { 
          label4.Text = scaned.ToString();
          lastUpdate = scaned;
       }
       ...
private void StartScan()
{
var lastupdate=0;
...
如果(上次更新+100<扫描)
{ 
label4.Text=scanned.ToString();
lastUpdate=扫描;
}
...

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

问题是每次读一行时都要更新UI元素(
label4

这可能非常昂贵,因此我建议删除该行:

label4.Text = scaned.ToString();

或者不太频繁地更新它,例如,每读取100行一次。

是否需要立即将所有数据存储在内存中?如果不知道如何使用它,则无法回答此问题。@JonathonReinhart它包含大量文件的md5哈希,我需要找到具有相同哈希的文件。(重复文件)您是否可以使用数据库而不是平面文件?任何数据库都会非常乐意返回匹配的行,等等。似乎您正在每行更新label4。这可能会减慢操作速度…您可以尝试每20-100行更新一次标签…参考@DigeMail。注释掉该行
label4.Text=Scanned。ToString()
。它可以大大提高性能。谢谢!因为我没有使用旧函数测量时间,所以我将首先测量时间,然后再测量代码。在
StreamReader.ReadLine
File.ReadLines
之间没有太多选择。两者都没有明显的速度,而且都是流式的。@marcgravel谢谢,我介绍了在我的回答中是这样的。
label4.Text = scaned.ToString();