C# 将大文件加载到字典的最佳解决方案
我有一个457379行的文本文件和这个结构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"
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();