|
Вопрос # 941/ вопрос открыт / |
|
Доброе утро!))), коллеги!
Вопрос: каким образом хранить на диске данные(в каком виде)?!
нехочу в СУБД пихать... хотя это самый простой способ)
////////////////////////////////////////////////////////////////////
Описание программы:
1. Это скриптовый движок.
2. Сейчас данные хранятся на диске в виде текста (строки)
3. Движок обрабатывает двумерный массив {10*10} этих данных. Идет подкачка данных (по необходимости) из
файлов.
4. Данные бывают:
- команды:
- простые (одна команда, +, -, ...)
- сложные (наборы команд или процедура(функция))
- хранилище:
- текстовые
- числовые
- связующие (для связи нескольких данных), необходимо чтоб загрузить в скриптовый движок все данные используемые задачей.
///////////////////////////////////////////////////////////////////////
 |
Вопрос задал: Грег Леонов (статус: 1-ый класс)
Вопрос отправлен: 26 сентября 2007, 23:16
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Feniks
Здравствуйте, Грег Леонов!
В вопросе №939 подымалась похожая тема. Отвечу и Вам.
Может стоит подумать в сторону формата XML. Он хорошо рекламируется, имеет стандартизация и широко применяется, например в Офисе, особенно в 2007. И имеется в открытом виде RFC по описанию этих файлов. Такие файлы структурированы, есть средства стандартные по работе с ними. А так же, в них можно и любые файлы запихивать. Один только минус - файл текстовый и сильно раздуется в размере, но приэтом, его можно сжимать.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 27 сентября 2007, 10:05
Оценка за ответ: 4
Комментарий к оценке: Спасибо за ответ, Feniks!
только я никогда не работал с XML и даже с трудом себе его представляю... извини.
Совет имеет место и даже очень!
только не в моем случае.
Оценка 4!
С уважением, Грег Леонов.
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Грег Леонов!
Когда то я решал подобную задачку. и пришёл к следующему решению. создаём систему классов, вложенных друг в дружку. каждый класс имеет метод записи/сохранения в поток вида
SavetoStream(st:TStream)
благодаря этому, можно сохраняться как и на диск, так и в память, так и в базу (БЛОБ поле)
Типичный код сохранения выглядит так
const KeyInt = 10; //уникальное для данного класса число
st.write(KeyInt,4);
st.write(KeyInt,Size);
st.Write(....); а тут сам объект сохраняется, размер его мы указали выше. многие классы умеют это делать самостоятельно, например TStringList, TBitmap.
KeyInt нужен для самоконтроля. процедура чтения сравнивает его с своим, и если не совпадает - бъет тревогу или, как вариант, возмножно решаться, какая именно будет запущена процедура чтения. если объект с таким номером неизвестен, то можно пропустить его (размер то мы знаем).
после этих трёх строк в цикле или как там получается, вызываем процедуру сохранения всех вложенных объектов, те, в своих будут дальше рекурсивно обрабатывать.
метод даёт хорошую производительность и гибкость.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 27 сентября 2007, 12:23
Оценка за ответ: 5
Комментарий к оценке: Спасибо за ответ, мне он понравился, т.е. я его почти понял)
Так и сделаю, создам классы, только в потоках я не силен.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 27 сентября 2007, 21:21; участников в обсуждении: 1.
|
Грег Леонов (статус: 1-ый класс), 26 сентября 2007, 23:20 [#1]:
Сорри, забыл добавить, что необходимо также хранить картинку, звук, видео.
Программа исключительно частного характера по моей инициативе.
Исследование небольшое провожу)
|
|
Грег Леонов (статус: 1-ый класс), 27 сентября 2007, 21:15 [#2]:
SavetoStream(st:TStream)
const KeyInt = 10; //уникальное для данного класса число
st.write(KeyInt,4); - 4 это как я понял размер в байтах
st.write(KeyInt,Size); - Size это размер объекта
st.Write(....); - тут сохраняем объект
почти все ясно)
никогда не работал с потоками, но изучу обязательно, данный совет очень понравился.
Твердая 5-ка !!!
|
|
Грег Леонов (статус: 1-ый класс), 27 сентября 2007, 21:21 [#3]:
С XML не дружу, хоть он и распространен. Считаю что мелкософт пудрит мозги со своими бесчисленными форматами.
Еще раз благодарю Feniks за совет.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|