Форум: "Начинающим";
Текущий архив: 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