Алгоритм просмотра больших текстовых файлов
Пишу утилиту, которая должна работать с текстовыми файлами достаточно большого размера (до 60-70 Мб); располагаться файлы могут как на локальном компьютере, так и на сетевом ресурсе. В связи с немалым размером возник вопрос: как лучше всего загружать этот файл?
Вам наверняка известна программа Far Manager. Если вы когда-либо замечали, что она открывает файлы очень быстро. В частности, специально проводил тестирование для больших "сетевых" файлов; оно показало, что время, необходимое для полной загрузки файла на локальный компьютер во много раз превосходит время, требуемое Far'у для открытия этого файла. В связи с этим - вопрос: возможно, там реализована какая-то постраничная подкачка или что-либо еще в этом роде? Какие будут идеи?
Спасибо.
А посмотреть? Исходники Far открыты.
Я бы открывал файл и в фоне скачивал его во временный каталог.
На самом деле зависит от того, какие манипуляции с файлом будут производиться. Если какая-то поточная обработка, то можно и не скачивать, а сразу обрабатывать.
hardcase, требуется только динамический просмотр (т.е. чтобы просмотрщик отлавливал изменения файла). Более того - файлы могут только дописываться (речь идет о просмотре логов mail- и прокси-серверов). Поэтому, наверное, пока остановлюсь на постраничной обработке. Всем спасибо, если какие-то еще идеи будут - буду благодарен.
может вместо сравнения размеров проще вести журнал? ну или сравнивать даты последних изменений, и же брать данные между ними?
Если речь про просмотро́вщик по F3, с ним всё ясно. Он читает первые байты (килобайты) файла, чтобы хватило заполнить экран. И всё. Полностью в память при просмотре файл никогда не грузится.
Из минусов:
* Не выводится число строк — его нельзя определить, не пере(с)читав весь файл.
* Иногда бывают глюки с прокруткой назад.
Лучше повеситься на событие изменение каталога, как делает Far.
По поводу события изменения каталога - наверное, соглашусь. Просто мне сейчас важнее определиться с общим алгоритмом чтения файла, а все остальное буду доделывать по ходу.
Только для этого используйте ReadDirectoryChangesW
По поводу таймера проясните, пожалуйста...
Куда, что записывается? IMHO не очень понятно сформулировано.
grgdvo, спасибо за ссылку, но это приложение пишу на чистом Си, без STL и прочего. В идеале вообще хочу сделать его "консольно-диалоговым", в стиле того же Far'а. Хотя по функционалу - действительно, filebuf близок к тому, что мне нужно.
По поводу постановки задачи. Есть текстовый файл, который может быть достаточно большого размера (как уже писал выше - до 60-70 МБ). Периодически этот файл изменяется, при этом возможно только одно изменение - запись текста в конец. Требуется организовать его просмотр в реальном времени с возможностью отлавливания всех изменений. Соответственно, по таймеру проверяю либо его размер, либо время последнего изменения, если этот параметр отличается - перечитываю. Хотя, действительно, по событию изменения каталога это сделать будет правильнее, спасибо тем, кто это посоветовал.
Вообще-то, если в Far нажать F3, а потом End, при изменении файла он будет автоматом прокручиваться в конец. Это штатная возможность Far для слежения за логами, часто используется в админской практике.
А так да,ReadDirectoryChangesW(только ANSI-версии нет почему-то)
Да, эту возможность Far'а хорошо знаю, поскольку у самого дома стоит и работает интернет-узел. :) Но у Far'а в этом плане есть несколько минусов:
- в случае, если открыто несколько файлов, прокрутка останавливается во всех, кроме активного;
- не хочется все-таки грузить целый Far ради всего-навсего просмотра логов :)
- хочется, чтобы моя утилита была системным сервисом и автоматически запускалась при загрузке системы с нужным набором файлов.
А в целом, бесспорно, Far - прекрасная разработка; собственно, на него и ориентируюсь.
IMHO твоя задача как раз и относится к варианту "(или легко вычисляемой заранее) длины". Возможно, вычисляемой не точно, но вполне можно взять размер чуть больше, так, чтоб вся страница гарантированно вычитывалась. Это будет оптимальнее, чем ReadFile с OVERLAPPED и уж значительно удобнее, если надо не только читать, но и писать.
К случаю сказать, тот же Word работает именно через MMF.
К случаю сказать, тот же Word работает именно через MMF.
Это слишком адвансед техника пусть юзает ReadFile.