我是Linq的粉丝,对于打字,清晰和简洁,我很感兴趣。但是我发现,与旧的数据视图相比,搜索匹配记录的速度非常慢,大约是2000倍!Linq对象与数据视图相比非常缓慢
我正在写一个应用程序来备份大量文件 - 500,000个文件和500 gb的数据。我在备份集中创建了一个文件清单,并将目录中的文件与清单中的文件进行比较,以记录已备份的内容。这样我就知道哪些文件已经更改,因此需要复制。
缓慢步骤是这样的一种:
var matchingMEs = from m in manifest where m.FullName == fi.FullName select m;
其中manifest = List<ManifestEntry>
和ManifestEntry
是一个相对简单POCO。
整体表现为每秒17-18个记录。
当我使用一个数据视图:
DataView vueManifest = new DataView(dt, "", "FullName", DataViewRowState.CurrentRows);
接在回路中找到匹配的清单条目用.FindRows:
matchingMEs = vueManifest.FindRows(fi.FullName);
...然后我得到每秒大约35,000个文件吞吐量!
这是正常的吗?我不能相信Linq会有这样的代价。 Linq还是物体会让事情变得缓慢?
(顺便说一句,我尝试使用一个Dictionary
和SortedList
还有List<ManifestEntries>
,他们都给出了一个关于同样的结果。)
如果您使用字典获得相同的错误结果,我假设您正在初始化它不正确。请显示相应的代码。另外,请显示'm.FullName'的限制。 “fi”是什么类型?更多:'FindRows'返回所有匹配的行。您的foreach循环结果不会执行任何搜索。与此相反,LINQ使用延迟执行,并将在您的'foreach'循环内执行搜索。为了正确比较运行时间,需要比较LINQ'foreach'和'FindRows' + foreach'循环的持续时间。 –
这看起来不正确。 ManifestEntry.FullName在做什么?它是从文件加载吗? –
我想你首先运行LINQ查询,然后是数据GRIDEVIEW查询,在这一步中,所有文件加载,所以数据网格运行速度快,但如果你反转执行路径,你会得到另一个结果。 –