Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.004 c
2-1217409396
Vlad
2008-07-30 13:16
2008.09.07
Поиск и замена в Excel через OLE


2-1217331791
Оксана Вл.
2008-07-29 15:43
2008.09.07
Удаление


1-1198089818
lookin
2007-12-19 21:43
2008.09.07
Создание-удаление диалога


2-1217375683
гуд
2008-07-30 03:54
2008.09.07
Цвет строки в RichEdit


2-1216792046
TStas
2008-07-23 09:47
2008.09.07
Есть ли какой-то особенный класс исключений при записи в ReadOnly





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский