我正在处理一个项目(.NET 3.5),读取两个文件,比较它们并找到缺失的对象。
基于这些数据,我需要进一步解析并定位对象位置。我将尝试进一步解释:
我有两个列表: 1个列表是服务器上所有文件的长列表,以及它们在服务器上的物理地址或其他服务器上,此文件略大于10亿行,并持续增长(有些荒谬,我知道)。文件大小目前约为160MB。 另一个列表是报告列表,显示服务器上丢失的文件,与列表1相比微不足道,通常不到1MB的大小。
我必须将列表2与列表1相交,并确定缺失对象的位置。列表中的项看起来像这样(不幸的是它是以空格分隔而不是CSV文档): filename.extension rev rev# source server:harddriveLocation\|filenameOnServer.extension origin
使用流,我将两个文件读入不同的字符串列表中。然后我采用正则表达式并将列表2中的项目解析到第三个列表中,其中包含filename.extension、rev和rev#。所有这些都工作得很好,问题在于性能太差。
我希望有一种更有效的方法来完成我正在做的事情。
基于这些数据,我需要进一步解析并定位对象位置。我将尝试进一步解释:
我有两个列表: 1个列表是服务器上所有文件的长列表,以及它们在服务器上的物理地址或其他服务器上,此文件略大于10亿行,并持续增长(有些荒谬,我知道)。文件大小目前约为160MB。 另一个列表是报告列表,显示服务器上丢失的文件,与列表1相比微不足道,通常不到1MB的大小。
我必须将列表2与列表1相交,并确定缺失对象的位置。列表中的项看起来像这样(不幸的是它是以空格分隔而不是CSV文档): filename.extension rev rev# source server:harddriveLocation\|filenameOnServer.extension origin
使用流,我将两个文件读入不同的字符串列表中。然后我采用正则表达式并将列表2中的项目解析到第三个列表中,其中包含filename.extension、rev和rev#。所有这些都工作得很好,问题在于性能太差。
我希望有一种更有效的方法来完成我正在做的事情。
foreach (String item in slMissingObjectReport)
{
if (item.Contains(".ext1") || item.Contains(".ext2") || item.Contains(".ext3"))
{
if (!item.Contains("|"))
{
slMissingObjects.Add(item + "," + slMissingObjectReport[i + 1] + "," + slMissingObjectReport[i + 2]); //object, rev, version
}
}
i++;
}
int j = 1; //debug only
foreach (String item in slMissingObjects)
{
IEnumerable<String> found = Enumerable.Empty<String>();
Stopwatch matchTime = new Stopwatch(); //used for debugging
matchTime.Start(); //start the stop watch
foreach (String items in slAllObjects.Where(s => s.Contains(item.Remove(item.IndexOf(',')))))
{
slFoundInAllObjects.Add(item);
}
matchTime.Stop();
tsStatus.Text = "Missing Object Count: " + slMissingObjects.Count + " | " + "All Objects count: " + slAllObjects.Count + " | Time elapsed: " + (taskTime.ElapsedMilliseconds) * 0.001 + "s | Items left: " + (slMissingObjects.Count - j).ToString();
j++;
}
taskTime.Stop();
lstStatus.Items.Add(("Time to complete all tasks: " + (taskTime.ElapsedMilliseconds) * 0.001) + "s");
这种方法是有效的,但由于目前我的缺失对象列表中有1300个缺失项,所以平均需要8到12分钟才能完成。其中耗时最长的部分是
foreach (String items in slAllObjects.Where(s => s.Contains(item.Remove(item.IndexOf(',')))))
{
slFoundInAllObjects.Add(item);
}
我只需要正确方向的指引,以及如何改进我正在努力完成的代码的帮助。LINQ并不是看起来很困难的部分,似乎是将其添加到列表中会影响性能。