我的应用程序需要打开很多小文件,比如说有1440个文件,每个文件包含一分钟的数据,以读取某一天的所有数据。每个文件只有几KB大小。这是一个GUI应用程序,所以我希望用户(==我!)不必等待太长时间。
结果发现打开这些文件相当慢。经过研究,大部分时间都花费在为每个文件创建FileStream(OpenStream = new FileStream)上。示例代码:
// stream en reader aanmaken
FileStream OpenStream;
BinaryReader bReader;
foreach (string file in files)
{
// bestaat de file? dan inlezen en opslaan
if (System.IO.File.Exists(file))
{
long Start = sw.ElapsedMilliseconds;
// file read only openen, anders kan de applicatie crashen
OpenStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Tijden.Add(sw.ElapsedMilliseconds - Start);
bReader = new BinaryReader(OpenStream);
// alles in één keer inlezen, werkt goed en snel
// -bijhouden of appenden nog wel mogelijk is, zonodig niet meer appenden
blAppend &= Bestanden.Add(file, bReader.ReadBytes((int)OpenStream.Length), blAppend);
// file sluiten
bReader.Close();
}
}
使用秒表计时器,我发现大多数(>80%)的时间都花在为每个文件创建FileStream上。创建BinaryReader并实际读取文件(Bestanden.add)几乎不需要时间。
我对此感到困惑,无法找到加快创建FileStream速度的方法。我该怎么办?
问题更新:
- 这种情况在Windows 7和Windows 10上都发生
- 文件是本地的(位于SSD磁盘上)
- 目录中仅有1440个文件
- 奇怪的是,稍后再次读取相同的文件时,创建FileStream突然几乎不需要时间。某处操作系统会记住文件流。
- 即使关闭应用程序并重新启动它,“再次”打开文件也几乎不需要时间。这使得查找性能问题变得非常困难。我不得不复制许多目录来一遍又一遍地重现这个问题。