Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Дерево и много текста   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1140168422
kyn66
2006-02-17 12:27
2006.03.26
Как доработать компонент


3-1138962198
DiGer
2006-02-03 13:23
2006.03.26
Экспорт данных в DBGrid


2-1142317624
chapchaps
2006-03-14 09:27
2006.03.26
Дельфи


15-1141457447
Pazitron_Brain
2006-03-04 10:30
2006.03.26
POP и IMAP


2-1142155503
Ega23
2006-03-12 12:25
2006.03.26
Сохранить файл в Unicode