Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизДерево и много текста Найти похожие ветки
← →
LordOfRock © (2006-03-13 22:47) [0]Привет всем. Передо мной стоит такая задача.
Нужно организовать в файле древовидную структуру, причём с каждой нодой должен быть связан определённый текст. Текста может быть много, нод тоже много, структура неограниченна. Сделал через движок своей БД - там всё это можно, НО - самый главный минус. (Из-за него мой движок и БД-то назвать нельзя, но я по прежнему буду называть его БД для сокращения :) ). при открытии файла он ВЕСЬ грузится в память. Что не есть хорошо.
При желании можно в нём сделать так, чтобы при открытии грузилось только дерево, а при выборе ноды подгружался текст. Это несложно. Но я не могу что-то никак догадаться как можно ИЗМЕНЯТЬ эти тексты напрямую в файле, особенно если у них размер меняется.
Сразу оговорюсь, что данные записывал через TFileStream.
Чтобы лучше понять, что я там написал, вот простой пример:|-Node1 /С ней связано 500 символов текста (500 байт по сути)/
|--Node1.2 /С ней связано 700 байт текста/
|-Node2 /С ней связано 1000 байт текста/
Всё это сохраняется последовательно в TFileStream
Как правильней можно организовать следующие действия:
1) Изменение текста (причём может изменяться размер его)
2) Перемещение, добавление, удаление нод, а соответственно и связаных с ней текстов.
без загрузки всего в память
В модуле ВСЁ это можно сделать, но только если предварительно ВСЁ загрузить в память. Хотелось бы улучшить модуль, чтбы работал без загрузки всего в память.
Спасибо за то, что дочитали до этого места :)
Отдельное спасибо за дельные предложения, ссылки.
← →
palva © (2006-03-13 23:02) [1]Для таких задач и предназначены БД. Например, можно без особых затруднений использовать Access. Но в данном случае, если дерево предполагается хранить в памяти, а тексты подгружать из файла, то тексты можно хранить в отдельном файле, любые изменения текстов делать добавлением измененного текста в конец и изменением в ноде смещения текста. Периодически можно делать сборку мусора, удаляя тексты, на которые нет ссылок.
← →
LordOfRock © (2006-03-13 23:07) [2]palva © (13.03.06 23:02) [1]
добавлением измененного текста в конец и изменением в ноде смещения текста
С этого места можно поподробнее плз? Не совсем понял.
И ещё, хотя это не суть как важно. Мне бы желательновсё в один файл - и дерево, и тексты, но это можно будет как-нить придумать самому.
← →
LordOfRock © (2006-03-13 23:09) [3]palva © (13.03.06 23:02) [1]
Но в данном случае, если дерево предполагается хранить в памяти
Ну, не совсем хранить. Загрузить его в TTreeView, каждой ноде сделать соответствие с текстом и всё. В TTreeView-шной памяти всё равно останется.
← →
Sergey Masloff (2006-03-13 23:10) [4]1) В нодах хранить адреса а не сами блоки текста
2) Причем хранить адрес не просто блока текста а блока с заголовком. В заголовке фиксированной длинны - статус+размер текста
3) Если запись изменилась идем к ее заголовку и смотрим есть ли там место. Если есть (новый текст меньше или равен) то пишем прямо туда же. Если места нет - помечаем блок как "неактуальный" и пишем в конец файла
4) Продумать как будешь искать неактуальные блоки для последующего сжатия файла. Варианта 2: а) у заголовка блока появляется еще сигнатура по которой будешь ее искать б) все блоки одинакового размера по определенным адресам если для текста не хватает одного блока в заголовок блока пишется ссылка на следующий блок
Ну что-то в таком роде.
← →
Sergey Masloff (2006-03-13 23:12) [5]В одном файле и дерево и тексты без проблем - тоже блоки выделяешь с заголовками в заголовке флаг - что это часть дерева или часть текстов. И ссылка на следующий блок.
← →
Чародей © (2006-03-13 23:23) [6]Короче писать практически драйвер файловой системы(локальный) с автоматической кластеризацией. Не завидное занятие
← →
LordOfRock © (2006-03-13 23:26) [7]
> 1) В нодах хранить адреса а не сами блоки текста
Я так понимаю, адреса в ФАЙЛЕ, Правильно?
> 2) Причем хранить адрес не просто блока текста а блока с
> заголовком. В заголовке фиксированной длинны - статус+размер
> текста
Блок текста можно наверно сделать так:TText = record
Size : Integer; //или Int64
Inactive : Boolean; //Активен или неактивен
Content : String; //Собственно, сам текст
end;
Правильно вас понял?
> 3) Если запись изменилась идем к ее заголовку и смотрим
> есть ли там место. Если есть (новый текст меньше или равен)
> то пишем прямо туда же. Если места нет - помечаем блок как
> "неактуальный" и пишем в конец файла
С ясно
> 4)
Сдесь, скорее пуснкт а).
Sergey Masloff (13.03.06 23:12) [5]
А вот с деревом не совсем понял. Если можно, поподробней опишите plz
Я делал примерно так:
[BEGINOFFILE] TFileStream
<ПАПКА>
Integer - число папок в корне
Папка№1
Папка№2
Папка№3
...
до этого самого Integer.
[Здесь сам текст]
</ПАПКА>
[ENDOFFILE]
Естественно, что каждая Папка№n - это структура, аналогичная
<ПАПКА></ПАПКА>
← →
LordOfRock © (2006-03-13 23:28) [8]
> Короче писать практически драйвер файловой системы(локальный)
> с автоматической кластеризацией. Не завидное занятие
>
Не пугай меня :)
← →
Чародей © (2006-03-14 00:11) [9]На сколько я знаю самая быстрая работа в стек файл-память возможна через File Mapping Functions. А насчет логической организации может всеже стоит подумать над возможностью стандартного размера н.пр 4Kb. 10000 записей 40 Mb, это не большой размер, к тому же может быть очень хорошо упакован.
← →
LordOfRock © (2006-03-14 00:36) [10]
> File Mapping Functions
Что за функции и гдже можно взять описание?
> может всеже стоит подумать над возможностью стандартного
> размера
А почему? Почему не переменный. Так и упаковывать ничего не надо будет.... Удалил просто незаюзанные куски файла и всё.
← →
LordOfRock © (2006-03-14 00:38) [11]Сегодня я наверно уже спать, а завтра попробую реализовать всё вышесказанное. Вроде в голове ясно всё представляю, посмотрим что на практике получится. Будут вопросы - запостингую либо сюда же, либо в новую ветку.
Всем спасибо и спокойной ночи.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c