Каков наилучший способ отображения больших файлов без использования большого объема памяти? - PullRequest
2 голосов
/ 29 марта 2009

Многие шестнадцатеричные редакторы, такие как Hex Workshop, могут даже читать файлы большого размера, сохраняя при этом сравнительно небольшой объем памяти, но при этом все равно продолжают плавную прокрутку. Я ищу лучший способ добиться этого, и поэтому у меня есть несколько связанных вопросов.

Должен ли я просто использовать FileStream?
- Является ли его буферизация на основе текущего местоположения поиска? (При прокрутке в обратном направлении обычно возникает ошибка страницы)
- Если я создам обертку для FileStream, которая использует только Seek для внутреннего использования, могу ли я нарушить способность FileStream правильно буферизовать? (то есть сильно ли пострадает производительность от повторного поиска, даже если запросы находятся рядом? Могу ли я полагаться на алгоритм буферизации или планировщик дисков для поддержания производительности?)

Было бы лучше использовать Memory-Mapped I / O? (Я действительно ожидаю, что файлы размером до 100 МБ)
- Могут ли страницы с ошибками поиска / перехода / быстрой прокрутки создавать заметные проблемы с производительностью?

В конечном итоге данные должны быть отображены. Должен ли я отображать весь файл как растровое изображение и делать недействительными части изображения при изменениях (позволяя элементу управления прокруткой выполнять свою собственную подкачку на изображении), или я просто должен генерировать текущую область отображения для событий прокрутки?

Короче говоря, нужно ли пейджировать Данные, сгенерированное изображение или и то, и другое, или я получаю / генерирую их по мере необходимости? Какие библиотеки (WPF / .Net) / объекты API лучше всего подходят для этой задачи?

Ответы [ 2 ]

2 голосов
/ 29 марта 2009

У вас, похоже, уже есть ответ.
Общее решение для этого - использовать файлы с отображением в памяти и позволить ОС работать с кэшированием и поиском.
Сначала попробуйте самое простое и очевидное решение. Если это не работает к вашему удовлетворению, оптимизируйте узкие места. Преждевременная оптимизация - корень всего зла.

1 голос
/ 29 марта 2009

100 МБ на самом деле не так много. Так что в памяти, вероятно, будет работать на новых машинах.

Но вы бы не хотели, чтобы ваше решение не масштабировалось с течением времени. В ту минуту, когда вы предполагаете, что ограничение составляет 100 МБ, кто-то попробует его с 200 МБ. Поэтому я бы порекомендовал вам пойти по пути поиска - это самый распространенный способ сделать это.

...