2013-02-22 79 views
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 > 

如上面的代码所示。
请咨询。

+0

你需要运行它同步,如果没有,使用异步 – 2013-02-22 17:02:34

+0

@CuongLe手段? – Pratik 2013-02-22 17:03:17

+0

你可以在不同的线程下运行这段代码 – 2013-02-22 17:03:53

回答

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次,每次。

0

如果您只需要知道CreationTime,就不要为每个文件实例化一个新的FileInfo类。另外,您不必使用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。特别是如果它的大目录。

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

FindFirstFile Implementation