Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.049 c
6-1134491378
Sysanin
2005-12-13 19:29
2006.03.26
Перехват пакетов


2-1142278839
*<ATAS>*SHERIFF
2006-03-13 22:40
2006.03.26
ClientSocket


15-1141040158
DesertAlex
2006-02-27 14:35
2006.03.26
Важно! Вопрос не по программированию. Delphi или VB?


2-1142261468
Net_Imeni
2006-03-13 17:51
2006.03.26
keybd_event


4-1136740034
Microsom
2006-01-08 20:07
2006.03.26
Delphi &amp; ADSI (ActiveDirectory)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский