0

我正在从大量文件中选择前一天的文件

// selecting around 80-120 files from 20,000 - 25,000 

FileInfo[] files = (new DirectoryInfo(dirPath)).GetFiles("*.xml");
 string[] selectedFiles = (from c in files
                                          where c.CreationTime >= DateTime.Today.AddDays(-1) && c.CreationTime < DateTime.Today.AddHours(-2.0)
                                          select c.FullName).ToArray();

以上运行大约需要 4-5 分钟,你能告诉我如何优化它,而不改变功能!

// file selection is between yesterday 0:00 to yesterday 22:00 <br >

如上面的代码所示。
友善的建议。

4

2 回答 2

1

可以尝试的东西:

FileInfo[] files = (new DirectoryInfo(dirPath)).GetFiles("*.xml");

DateTime lowDate = DateTime.Today.AddDays(-1);
DateTime highDate = DateTime.Today.AddHours(-2.0);

 string[] selectedFiles = (from c in files
                                          where c.CreationTime >= lowDate && c.CreationTime < highDate
                                          select c.FullName).ToArray();

这些日期可能每次都被计算了 20,000 多次。

于 2013-02-22T17:06:29.113 回答
0

FileInfo如果您只需要知道 CreationTime,请不要为每个文件实例化一个新类。此外,您不必使用DirectoryInfo.

我会使用这样的东西:

DateTime lowDate = DateTime.Today.AddDays(-1);
DateTime highDate = DateTime.Today.AddHours(-2.0);

var filteredFileNames = new List<String>();
string[] fileNames;
fileNames = Directory.GetFiles(dirPath, "*.xml")

for (int i = 0; i < fileNames.Length; i++)
{
   var creationTime = File.GetCreationTimeUtc(fileNames[i]);
   if(creationTime >= lowDate && creationTime < highDate)
   {
    filteredFileNames.Add(filenNames[i]);
   }
}

如果您不受 I/O 限制,您仍然可以将时间范围的一部分划分为不同的Tasks/ Threads(取决于您使用的 .NET 版本)并在最后累积名称。但是,完成的工作最多的是Directory.GetFiles. 特别是如果它的目录很大。

当我不得不在一个目录中处理大量文件时,我继续使用FindFirstFile/FindNextFileFindCloseWin 32 API。它提供的开销要少得多,而且速度更快。

FindFirstFile 实现

于 2013-02-22T18:22:12.963 回答