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

Вниз

Структуры и указатели   Найти похожие ветки 

 
h5who   (2008-07-25 18:26) [0]

У меня в программе есть файл, в котором я храню различные данные (начиная от чисел и заканчивая не большими файлами). Структура такова: есть определенное количество основных записей, которые характреизуются именем и числовым идентификтором, а каждая такая основная запись может содержать в себе дополнительные записи, в которых и содержаться сами данные — это могут быть числа, строки и т.п; колчество таких дополнительных записей неограничено и дополнительные записи могут быть любого типа (строки, числа  , ...).

Задача: оптимальным и нормальным сопсобом хранить все эти данные из файла во время работы программы.

Есть у меня есть примерно такие структуры:
PTextRecord = ^TTextRecord; // это один из типов дополнительной записи
TTextRecord = record
str1: string;
str2: string;
wrd: Word;
end;

PWordRecord = ^TWordRecord; // это тоже один из типов дополнительной записи
TWordRecord = record
wrd1: Word;
wrd2: Word;
wrd3: Word;
str: string;
end;

PText2Record = ^TText2Record;  // и это один из типов дополнительной записи
TText2Record = record
str1: string;
str2: string;
str3: string;
end;

TBRecord = record  // это всегда присутсвует в дополнительной записи, тут фалги и прочее
RecordType: Word;
       Flags: DWord;
       .......
case Byte of
 0: (TextRecord: PTextRecord);
 1: (WordRecord: PWordRecord);
 2: (Text2Record: PText2Record);
end;

PMyItem = ^TMyItem;  // это основная запись, в которой содержаться все дополнительные записи
TMyItem = record
Name: string;
TypeA: DWord;
       TreeLevel: Integer;
Records: array of TBRecord;
end;


Я из файла считываю данные и заполняю в программе:

for i := 0 to MyItemsInFile - 1 do
begin
New(PMyItemVar);
with PMyItemVar ^ do
begin
 Name := СчитываюИзФайла;
 TypeA := СчитываюИзФайла;
 SetLength(Records, СчитываюИзФайла);
 for i := Low(Records) to High(Records) do
  with Records[i] do
  begin
   RecordType := СчитываюИзФайла;
   case RecordType of
    1:
    begin
     New(TextRecord);
     with TextRecord^ do
     begin
      значения считываю из файла и заполняю
     end;
    end;
    2:
    begin
     New(WordRecord);
     with WordRecord^ do
     begin
      значения считываю из файла и заполняю
     end;
    end;
    3:
    begin
     New(Text2Record);
     with Text2Record^ do
     begin
      значения считываю из файла и заполняю
     end;
    end;
   end;
  end;
end;
TreeView1.AddChild(..., PMyItemVar^.Name).Data := PMyItemVar;
end;


В итоге все уазатели на PMyItemVar я храню в дереве TTreeView.
Мне кажется это все ахинеей, особенно указатели в вариантной записи. Что скажете по поводу всего этого? Возможно как-то это все улучшить?

Рад услышать любые идеи! Спасибо.


 
Сергей М. ©   (2008-07-25 20:31) [1]


> уазатели на PMyItemVar я храню в дереве TTreeView.


Не-а .. В дереве ты хранишь совсем не то) ..

Ну а ахинея или не ахинея - решать тебе, главное чтобы "оно" работало  и каши не просило)


 
Loginov Dmitry ©   (2008-07-25 21:46) [2]

> Задача: оптимальным и нормальным сопсобом хранить все эти
> данные из файла во время работы программы.


это как? :)


> Что скажете по поводу всего этого? Возможно как-то это все
> улучшить?


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


 
Alucard   (2008-07-29 00:23) [3]

С точки зрения модели доступа к данным, ничего неправильного нет. Использование типизированных указателей в дельфи - самый быстрый и относительно защищенный способ обращения к данным.
Вопрос в характере доступа к этим данным со стороны программы. Грузить в память полный набор данных может иметь смысл, если все его элементы будут использоваться, или для простоты разработки. В других случаях стоит рассмотреть формат файла, поддерживающий произвольный доступ (например, OLE Compound File), а в TreeViewItem.Data хранить ключ доступа к элементу.


 
MsGuns ©   (2008-07-29 00:53) [4]

Попытка смастерить собственную БД ?
Ересь какая-то


 
MsGuns ©   (2008-07-29 01:01) [5]

>Alucard   (29.07.08 00:23) [3]
>С точки зрения модели доступа к данным, ничего неправильного нет. >Использование типизированных указателей в дельфи - самый быстрый и >относительно защищенный способ обращения к данным.

Именно с "С точки зрения модели доступа к данным" сабж - полная чушь ибо никакой модели там не просматривается , начиная от башибузукских имен как типов, так и полй в них, и заканчивая во этим "шедевром":

Records: array of TBRecord;

И на счет "быстроты" и (особенно) "защищенности" - аргумент смехотворный, ибо в Делфи есть классы и вся мощь компиллятора для их гибкого и удобного использования.

Что же касается самой организации хранения данных, то ничего лучше СУБД Вы не придумаете, смею утвержать наверняка. И мастерить свою СУБД - есть признак не крутизны, а дремучести, в какие бы красивые одежды ее тут не рядили.


 
Alucard   (2008-07-29 02:06) [6]

Все зависит от задачи. Если требуется предельная производительность, лучшего средства, чем типизированные указатели в область заранее выделенной памяти в сочетании с эффективной структурой данных для их хранения, нет. Использование объектов вносит оверхед, который может оказаться существенным. Он формируется как за счет опосредованного обращения к полям, так и за счет ошибок страниц при доступе к объектам. Это легко проверить.
СУБД внутри себя реализуют весьма похожие механизмы доступа к данным, а также много дополнительных, таких как обеспечение транзакционной целостности, блокировки, пользовательские контексты, синтаксические анализаторы, планировщики запросов, и прочие, в данном случае, вероятно, излишние вещи. Не стоит забывать и о том, что СУБД придется устанавливать вместе с программой, что не всегда приемлемо. Но все, конечно же, зависит от задачи.


 
Loginov Dmitry ©   (2008-07-29 07:53) [7]

> Что же касается самой организации хранения данных, то ничего
> лучше СУБД Вы не придумаете, смею утвержать наверняка.


хорошая аргументация :)


> И мастерить свою СУБД - есть признак не крутизны, а дремучести,
> в какие бы красивые одежды ее тут не рядили.


СУБД никто не собирался делать. Для простого хранения структурированных данных, как в случае автора гораздо эффективнее обычный бинарник. Приплетать сюда СУБД - это из пушки по воробьям.


 
sniknik ©   (2008-07-29 08:31) [8]

> СУБД никто не собирался делать.
судя по Alucard   (29.07.08 00:23) [3], второй абзац, именно ее он и делает.
-> "произвольный доступ", "ограниченные выборки", "скорость"(потуги на нее)... - еще чуток и до индексов дойдет.
... а как поймет, что обычно нужен многопользовательский доступ (это на практике, при реальном внедрении своего творения) то и транзакции и все остальное, от чего сейчас легкомысленно отмахивается как от ненужного.


 
Palladin ©   (2008-07-29 08:37) [9]

сейчас это 10 записей для standalone, завтра 100 тыщ для cli-srv...


 
Loginov Dmitry ©   (2008-07-29 09:08) [10]


> второй абзац, именно ее он и делает.


Нууу.... Тогда Да! :)



Страницы: 1 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
3-1204803441
igorm
2008-03-06 14:37
2008.09.07
sql как выбрать наибольшее знач из трех полей табл


3-1205319290
rebroff
2008-03-12 13:54
2008.09.07
Повторяющиеся значения поля


2-1217258154
lavgirls
2008-07-28 19:15
2008.09.07
Выравнивание текста


15-1216189504
Гость
2008-07-16 10:25
2008.09.07
Replace all


2-1217350317
Сергей
2008-07-29 20:51
2008.09.07
Как добавить unit из другой программы?