Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Memo для очень больших файлов


Автор: Vit 29.7.2002, 23:34
Есть необходимость создания проги для редактирования очень больших текстовых файлов (имеются ввиду Log файлы от разных, применяемых у меня програм). Размеры файлов составляют от сотен мегабайт до нескольких гигабайт. Естественно, что ни о какой загрузке такого файла целиком не идёт речь - это завесит любую машину, и тормознёт любой сервер. Естественное решение - это организация загрузки файла по мере необходимости - кусками, более или менее удобоваримых размеров. Однако реализация такой штуки по мере осмысления представляется мне не столь простой как на первый взгляд. Например, я подгружаю куски по 64Kb, как мне выделить кусок текста и скопировать в буфер большего размера?

Господа, кто-нибудь делал что-либо подобное? Поделитесь опытом? Может у кого есть какой-нибудь компонент или класс для работы с такими файлами?

Автор: Song 30.7.2002, 08:37
Ничего создавать не надо. Всё уже сделали за нас: CreateFileMapping()

Автор: Vit 30.7.2002, 16:10
А можно пример какой-никакой?

Автор: Song 30.7.2002, 17:24
Можно, завтра.

Автор: Song 31.7.2002, 09:06
Vit, тут я посмотрел, готового у меня нет отрывка :(
Давай сделаем творческий проект, если тебя это конечно реально интересует.
Что пока надо:
1. Наследник от TMemo
2. Перехват движения по мемо. Идея такая: нужно отследить тот момент когда нужно подгрузить в мемо очередной кусочек текста, т.к. в единый момент времени мы будем отображать в мемо только столько текста сколько убирается в его клиентскую область. Когда произойдёт движение вниз или вверх мы подгружаем очередной кадр с соответственным сдвигом.

Вообщем пока так. А я соображу с проецированным файлом.
Кстати нам нужно использовать CreateFileMapping()+MapViewOfFile()

Автор: Vit 31.7.2002, 15:24
Ты знаешь, наверное в этом проекте  сложна не столько реализация, сколько надо понять как оно будет работать. Подгрузить следующий кусок не проблема, проблема работы на стыках кусков - например выделение текста для копирования , если выделение находится на стыке кусков или, что ещё хуже, выделение больше одного куска... А также алгоритм вставки текста - если напрямую решать, то после каждой вставленной буквы надо перезаписывать огромный файл, значит надо где-то буфферизировать данные, а затем делать сохранение одним махом, причём опять-таки буфферизированные данные могут выскочить за предел текущего блока, затем при чтении изменённого блока вновь, он должен читаться с учётом изменений. В общем работка ещё та!

Автор: neutrino 31.7.2002, 20:23
Цитата

...проблема работы на стыках кусков - например выделение текста для копирования , если выделение находится на стыке кусков...

Надо сделать так, чтобы куски "пересекались". Какие-нибудь 3Кб чтобы были обшие у каждои' пары кусков.
Цитата

А также алгоритм вставки текста - если напрямую решать, то после каждой вставленной буквы надо перезаписывать огромный файл, значит надо где-то буфферизировать данные, а затем делать сохранение одним махом, причём опять-таки буфферизированные данные могут выскочить за предел текущего блока...

Можно запомнить границы загруженного в память куска, и записать поверх него, при этом немного фрагментирoвать файл в физическом смысле.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)