Моему приложению нужно открыть много маленьких файлов, скажем, 1440 файлов, каждый из которых содержит данные за 1 минуту, чтобы прочитать все данные определенного дня. Каждый файл имеет всего пару килобайт. Это для графического приложения, поэтому я хочу, чтобы пользователь (== me!) Не должен был ждать слишком долго.
Оказывается, что открытие файлов происходит довольно медленно. После исследования большинство времени тратится впустую на создание FileStream (OpenStream = новый 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?
обновите вопрос:
- это происходит как на окнах 7, так и на окнах 10
- файлы являются локальными (на диске SSD)
- есть только 1440 файлов в каталоге
- странно, снова прочитав (то же) файлы, создание FileStreams внезапно обошлось почти безрезультатно. Где-то ОС вспоминая филе.
- даже если я закрою приложение и перезапустил его, открытие файлов "снова" также почти не требует времени. Это затрудняет поиск проблема производительности. Мне пришлось сделать много копий каталога, чтобы воссоздайте проблему снова и снова.