Моя программа должна читать куски из огромного двоичного файла с произвольным доступом.У меня есть список смещений и длин, которые могут иметь несколько тысяч записей.Пользователь выбирает запись, и программа ищет смещение и считывает длину байтов.
Программа внутренне использует TMemoryStream для хранения и обработки фрагментов, считанных из файла.Чтение данных выполняется с помощью TFileStream следующим образом:
FileStream.Position := Offset;
MemoryStream.CopyFrom(FileStream, Size);
Это прекрасно работает, но, к сожалению, становится все медленнее по мере увеличения файлов.Размер файла начинается с нескольких мегабайт, но часто достигает нескольких десятков гигабайт.Размер читаемых фрагментов составляет около 100 кбайт.
Содержимое файла читается только моей программой.Это единственная программа, обращающаяся к файлу в то время.Кроме того, файлы хранятся локально, так что это не проблема сети.
Я использую Delphi 2007 для Windows XP.
Что я могу сделать, чтобы ускорить доступ к этому файлу?
edit:
- Доступ к файлам для больших файлов медленный, независимо от того, какая часть файла читается.
- Программа обычно не читает файл последовательно,Порядок чанков определяется пользователем и не может быть предсказан.
- Всегда читать чанк из большого файла всегда медленнее, чем читать такой же большой чанк из небольшого файла.
- IЯ говорю о производительности чтения фрагмента из файла, а не об общем времени, которое требуется для обработки всего файла.Последнее, очевидно, заняло бы больше времени для больших файлов, но здесь проблема не в этом.
Мне нужно извиниться перед всеми: После того, как я реализовал доступ к файлу, используя отображенный в память файл какпредположил, что оказалось, что это не имеет большого значения.Но также после того, как я добавил еще какой-то временный код, оказалось, что не доступ к файлам замедляет работу программы.Доступ к файлу занимает практически постоянное время, независимо от размера файла.У некоторой части пользовательского интерфейса (которую я еще не определил), похоже, есть проблема с производительностью больших объемов данных, и почему-то я не смог увидеть разницу, когда впервые запустил процессы.
Извините забыть небрежным в определении узкого места.