Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Алгоритм просмотра больших текстовых файлов

278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
Всем здравствуйте!

Пишу утилиту, которая должна работать с текстовыми файлами достаточно большого размера (до 60-70 Мб); располагаться файлы могут как на локальном компьютере, так и на сетевом ресурсе. В связи с немалым размером возник вопрос: как лучше всего загружать этот файл?

Вам наверняка известна программа Far Manager. Если вы когда-либо замечали, что она открывает файлы очень быстро. В частности, специально проводил тестирование для больших "сетевых" файлов; оно показало, что время, необходимое для полной загрузки файла на локальный компьютер во много раз превосходит время, требуемое Far'у для открытия этого файла. В связи с этим - вопрос: возможно, там реализована какая-то постраничная подкачка или что-либо еще в этом роде? Какие будут идеи?

Спасибо.
10
19 января 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: Alexander92
возможно, там реализована какая-то постраничная подкачка или что-либо еще в этом роде?


А посмотреть? Исходники Far открыты.

5
19 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Alexander92
возможно, там реализована какая-то постраничная подкачка или что-либо еще в этом роде? Какие будут идеи?

Я бы открывал файл и в фоне скачивал его во временный каталог.

262
19 января 2011 года
Iktomy
1.2K / / 11.10.2004
Возможно открывать файл частями. И возможно это будет лучшее решение.
5
19 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Iktomy
Возможно открывать файл частями. И возможно это будет лучшее решение.

На самом деле зависит от того, какие манипуляции с файлом будут производиться. Если какая-то поточная обработка, то можно и не скачивать, а сразу обрабатывать.

278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
Freeman, согласен. Не включился, что Far действительно open source.

hardcase, требуется только динамический просмотр (т.е. чтобы просмотрщик отлавливал изменения файла). Более того - файлы могут только дописываться (речь идет о просмотре логов mail- и прокси-серверов). Поэтому, наверное, пока остановлюсь на постраничной обработке. Всем спасибо, если какие-то еще идеи будут - буду благодарен.
262
19 января 2011 года
Iktomy
1.2K / / 11.10.2004
А можете примерно расписать процессы работы с файлами? Может тогда появится больше конкретики в ответах;)
278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
По большому счету, нужно обеспечить функционал просмотрщика Far Manager'а, но с некоторыми дополнениями. Процессы работы с файлами достаточно очевидные - открыть файл, загрузить (либо целиком, либо каким-то буфером - в чем и вопрос, собственно :)) и включить таймер, который будет сравнивать размер файла с предыдущим и при необходимости дописывать в окно текущее состояние этого файла.
262
19 января 2011 года
Iktomy
1.2K / / 11.10.2004
а примерная структура данных в файле?
может вместо сравнения размеров проще вести журнал? ну или сравнивать даты последних изменений, и же брать данные между ними?
10
19 января 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: Alexander92
функционал просмотрщика Far Manager'а


Если речь про просмотро́вщик по F3, с ним всё ясно. Он читает первые байты (килобайты) файла, чтобы хватило заполнить экран. И всё. Полностью в память при просмотре файл никогда не грузится.

Из минусов:
* Не выводится число строк — его нельзя определить, не пере(с)читав весь файл.
* Иногда бывают глюки с прокруткой назад.

Цитата: Alexander92
включить таймер, который будет сравнивать размер файла с предыдущим и при необходимости дописывать в окно текущее состояние этого файла.


Лучше повеситься на событие изменение каталога, как делает Far.

278
19 января 2011 года
Alexander92
1.1K / / 04.08.2008
Freeman, спасибо за детальный ответ. После тщательного анализа я пришел к выводу, что все-таки те минусы, которые вы назвали, не настолько значительны по сравнению с плюсом, состоящем в скорости доступа к данным.
По поводу события изменения каталога - наверное, соглашусь. Просто мне сейчас важнее определиться с общим алгоритмом чтения файла, а все остальное буду доделывать по ходу.
342
20 января 2011 года
Yos
209 / / 21.06.2003
Цитата: Alexander92
По поводу события изменения каталога - наверное, соглашусь.

Только для этого используйте ReadDirectoryChangesW

412
20 января 2011 года
grgdvo
323 / / 04.07.2007
По поводу буферизации посмотрите на STL класс filebuf.

По поводу таймера проясните, пожалуйста...
Куда, что записывается? IMHO не очень понятно сформулировано.
278
20 января 2011 года
Alexander92
1.1K / / 04.08.2008
Yos, почитал, спасибо.

grgdvo, спасибо за ссылку, но это приложение пишу на чистом Си, без STL и прочего. В идеале вообще хочу сделать его "консольно-диалоговым", в стиле того же Far'а. Хотя по функционалу - действительно, filebuf близок к тому, что мне нужно.

По поводу постановки задачи. Есть текстовый файл, который может быть достаточно большого размера (как уже писал выше - до 60-70 МБ). Периодически этот файл изменяется, при этом возможно только одно изменение - запись текста в конец. Требуется организовать его просмотр в реальном времени с возможностью отлавливания всех изменений. Соответственно, по таймеру проверяю либо его размер, либо время последнего изменения, если этот параметр отличается - перечитываю. Хотя, действительно, по событию изменения каталога это сделать будет правильнее, спасибо тем, кто это посоветовал.
10
20 января 2011 года
Freeman
3.2K / / 06.03.2004
Цитата: Alexander92
Требуется организовать его просмотр в реальном времени с возможностью отлавливания всех изменений.


Вообще-то, если в Far нажать F3, а потом End, при изменении файла он будет автоматом прокручиваться в конец. Это штатная возможность Far для слежения за логами, часто используется в админской практике.

7
20 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Freeman,таки опредил с советом.Только немного не на ту функцию ссылку дал:)
А так да,ReadDirectoryChangesW(только ANSI-версии нет почему-то)
278
21 января 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: Freeman
Вообще-то, если в Far нажать F3, а потом End, при изменении файла он будет автоматом прокручиваться в конец. Это штатная возможность Far для слежения за логами, часто используется в админской практике.



Да, эту возможность Far'а хорошо знаю, поскольку у самого дома стоит и работает интернет-узел. :) Но у Far'а в этом плане есть несколько минусов:
- в случае, если открыто несколько файлов, прокрутка останавливается во всех, кроме активного;
- не хочется все-таки грузить целый Far ради всего-навсего просмотра логов :)
- хочется, чтобы моя утилита была системным сервисом и автоматически запускалась при загрузке системы с нужным набором файлов.

А в целом, бесспорно, Far - прекрасная разработка; собственно, на него и ориентируюсь.

3
22 января 2011 года
Green
4.8K / / 20.01.2000
В рещении сабжа должен помочь memory mapped file.
278
22 января 2011 года
Alexander92
1.1K / / 04.08.2008
Green, если я правильно понимаю, маппинг удобен тогда, когда страницы оказываются четко фиксированной (или легко вычисляемой заранее) длины. В моей же ситуации мне нужно заполнить экран, т.е. первичным оказывается количество _строк_ на странице; сама же страница может быть в этом случае произвольного размера. Мне кажется все-таки, что вручную пройтись по файлу в поисках границ страницы здесь удобнее. В данный момент я использую ReadFile с OVERLAPPED. Или я все-таки что-то неправильно понимаю?
3
23 января 2011 года
Green
4.8K / / 20.01.2000
Цитата: Alexander92
Green, если я правильно понимаю, маппинг удобен тогда, когда страницы оказываются четко фиксированной (или легко вычисляемой заранее) длины. В моей же ситуации мне нужно заполнить экран, т.е. первичным оказывается количество _строк_ на странице; сама же страница может быть в этом случае произвольного размера. Мне кажется все-таки, что вручную пройтись по файлу в поисках границ страницы здесь удобнее. В данный момент я использую ReadFile с OVERLAPPED. Или я все-таки что-то неправильно понимаю?


IMHO твоя задача как раз и относится к варианту "(или легко вычисляемой заранее) длины". Возможно, вычисляемой не точно, но вполне можно взять размер чуть больше, так, чтоб вся страница гарантированно вычитывалась. Это будет оптимальнее, чем ReadFile с OVERLAPPED и уж значительно удобнее, если надо не только читать, но и писать.
К случаю сказать, тот же Word работает именно через MMF.

260
23 января 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: Green
IMHO твоя задача как раз и относится к варианту "(или легко вычисляемой заранее) длины". Возможно, вычисляемой не точно, но вполне можно взять размер чуть больше, так, чтоб вся страница гарантированно вычитывалась. Это будет оптимальнее, чем ReadFile с OVERLAPPED и уж значительно удобнее, если надо не только читать, но и писать.
К случаю сказать, тот же Word работает именно через MMF.



Это слишком адвансед техника пусть юзает ReadFile.

278
23 января 2011 года
Alexander92
1.1K / / 04.08.2008
Green, спасибо. Посмотрю повнимательнее в эту сторону.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог