![]() |
|
|
![]()
|
|
| lexxxSV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Доброе время суток.
Имеется заготовка класса TSingleTable, которая предназначается для хранения произвольных данных неограниченного объёма. Итак. Для начала хочу немного рассказать о самой идее и функциональности данного класса. Класс TSingleTable был задуман как альтернатива существующим базам данных. Проблема в том, что даже несмотря на открытость сущетствующих баз данных их объём кода достаточно большой, не каждый желающий может взять и сходу разобраться как работает база данных, как её оптимизировать под конкретную задачу и как, к примеру, добавить что-то от себя, в случае если это что-то понадобилось в процессе разработки программы. К тому же существующие базы данных ориентированны на работу с языком запросов SQL и многими таблицами одновременно, что не всегда может быть востребовано при разработке программы. Разрабатываемый класс TSingleTable планируется сделать прозрачным для программиста (минимум базовых функций: - добавление, удаление, редактирование, поиск (он же фильтрация)) и занимать минимальный объём исходного кода и - минимальный общий размер после компиляции. Класс должен быть подобием конструктора, чтобы в случае необходимости в него можно было дописать нужный функционал не особо заморачиваясь с кодом. Особенность класса TSingleTable заключается в следующем: - хранение безтиповых данных, произвольного размера в каждом поле - произвольное количество полей, индивидуально для каждой записи (т.е. первая запись может иметь два поля, вторая запись может иметь двадцать полей, третья запись может иметь одно поле и т.п.) - неограниченное хранение произвольных объёмов данных (>2 гб) Принцип работы класса: - Класс работает с блоками (статически заданными массивами конечного размера). Сначала мы читаем первый блок, например объёмом в 128 мб, работаем с ним, потом выгружаем блок и переходим к следующему блоку. - Класс не будет иметь индексов. Вместо этого планируется сделать групповую обработку данных. Т.е. допустим нам требуется выполнить последовательно выборку записей в соответствии с некоторыми полями. Мы заносим все данные во временный блок, после чего начинаем процесс фильтрации заданной группы записей сначала в одном блоке, затем переходим ко второму блоку и т.д. Эффективность заключается в том, что вместо того, чтобы постоянно подгружать блоки ради фильтрации одной записи, мы обрабатываем сразу несколько записей в одном загруженном в память блоке, и лишь затем переходим к следующему блоку. Таким образом помимо увеличения скорости, добиваемся эффективного использования жёсткого диска. - Класс не будет иметь визуального интерфейса, вся его работа будет заточена на невизуальное проектирование, например при создании консольных приложений или фоновых служб. Что сделано на данный момент: - Написана заготовка, которая умеет открывать/закрывать таблицу, добавлять записи, выводить записи на экран (не до конца оттестировано) + внутренние процедуры, предназначенные для подгрузки/выгрузки кэш-блоков - Класс написан с использованием WinAPI, используются только два подключаемых модуля: Windows.pas (стандартный), uLog (собственный оттестированный модуль), для ведения лога. - Реализованно управление ошибками На данный момент размер исполняемой консольной программы с использованием данного класса примерно равен 23кб. Объём кода 329 строчек. Вопрос. Насколько актуальна такая разработка и есть ли у кого-нибудь желание помочь в разработке. |
|||
|
||||
| lexxxSV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Выкладываю декларацию класса:
|
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: нет Всего: 4 |
Тут смотря, что получится: если будет медленно работать или сильно жрать оперативку, то в ряд ли будет спрос, а вот если будет быстрым, не боятся больших объемов данных и в то же время не насиловать оперативную память, то я бы даже заплатил за такое. |
|||
|
||||
| lexxxSV |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Для того чтобы это всё работало быстро, нужно загрузить весь объём в быстродейственную память. При работе с блоками же сложно однозначно сказать, поскольку самым узким местом здесь является загрузка и выгрузка блоков. Через winAPI на компьютере трёх летней давности, при размере 3 гб блок размером 256 мб сохраняется <1сек, грузится и того быстрее. На компьютере помощнее объёмом около 1 гб выполнял как-то быструю сортировку 1 млрд байт рандомных чисел, 2-3 сек. Так родилась идея выполнять групповые операции в памяти, сначала копим, затем выполняем. Касаемо данного класса: Структура записи в блоках следующая: данные;размер поля;номер поля;общий размер Следовательно искомые поля можно будет сначала сверять по длинне и потом по совпадаемости. Поля не сошлись прыгаем дальше через всю запись. Ну а если поля будут заведомо отсортированы... Вообщем пока сложно и рано что-то говорить про скорость, но думаю что при грамотно спроектированных групповых запросах пару сотен "запросов" при нескольких миллионах записей наверное вывезет за разумное время.
Размер кэш-блоков можно задавать самому, вы можете видеть это из декларации. Конечно можно в будущем допилить на динамическое выделение памяти в процессе создания класса (опыт имеется), но есть мнение, что динамические массивы работают несколько медленнее по сравнению со статическими.
Проект не коммерческий. P.S. Я видел много топиков с возгласами давайте изобретём велосипед. Друзья давайте. Давайте попробуем создать уже наконец нормальный инструмент. Готов помочь. P.S.S. Куда лучше выложить код. |
||||||
|
|||||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
||||
|
||||
| lexxxSV |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Создал аккаунт, зашёл, увидел всё на каком-то непонятном языке, то ли корейский, то ли въетнамский. Вообщем решил пока создать сайт на ucoz. Застрял на выборе лицензии. Больше склоняюсь в сторону BSD. Сайт впринципе готов (пока без документации), исходники залиты, но ссылку пока могу дать в личку (как только определюсь с выбором лицензии, так ссылка станет общедоступной). |
||||
|
|||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
здесь бы давно уже выложил и не мучался
|
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
||||
|
||||
| lexxxSV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Лицензия BSD.
Ссылка на сайт http://tsingletable.ucoz.ru/ Там можно скачать исходники. Далее буду писать документацию, приводить мысли в порядок, ну и конечно же время от времени высталять новые сборки. offtopic:
Не сразу заметил. Архив залил и сюда тоже. Присоединённый файл ( Кол-во скачиваний: 3 )
cSingleTable.zip 4,18 Kb |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: нет Всего: 4 |
Не хватает примеров работы.
|
|||
|
||||
| lexxxSV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Не совсем уловил суть мыслей. Если вы имели ввиду отсуствие функций поиска, добавления, удаления, то их там пока нет, поскольку проект находится на начальной стадии разработки. Если непонятен сам принцип работы, то для этого ещё будет создаваться документация, в которой будет отражено: физический и логический уровень построения таблицы на общем уровне, на частном уровне и детально рассмотрена работа конкретных функций и процедур. Offtopic Этот класс является результатом пятилетних наработок других проектов. Вся информация собиралась по крупицам с разных источников. Основой зарождения данного класса послужила чистая случайность. Когда-то давно, когда я не был знаком с базами данных, считал способны в секунду обрабатывать сотни миллионов данных на обычном компе. Во-всяком случае так писалось чуть-ли не в каждой книжке. Затем когда я столкнулся с реальной задачей, особо не заморачиваясь использовал Paradox. Удивление было когда оказалось, когда выяснилось что база данных имеет ограничение. Потом пошли в ход Access, SQLite но желаемого эффекта достигнуто не было. В Access'e я считал сто тысяч записей чем-то большим, SQLite, на тот момент времени, начал глючить после загрузки 300 мб. FireBird я вообще не понимал как подключать. А когда ради любопытства были просмотренны исходники открытых СУБД остался шок и большой вопрос как это всё может работать. После этого начались неудачные попытки написать свою БД с нуля. В результате выяснилось, что простейший статический массив и стандартные файловые функции оказались вне конкуренции. После этого стала доступна возможность обрабатывать десятки миллионов записей за секунды в самописных велосипедах с использованием одного только только большого статического массива, благо память на компе позволяла (3 гб). Но самой большой подлянкой оказалось то, что массив больше двух гб выделить нельзя, даже если на компе уже давно стоит >3 гб. Незнаю насчёт 64-разрядной архитектуры, но гуглил и похоже траблы будут. Наверное единственным спасением будут ssd винты, но и там тоже свои заморочки (количество перезаписей). Так постепенно появилась идея о том, а что будет если начать разрабатывать не БД а одиночную таблицу. Во всяком случае в своих проектах я чаще использую такие таблицы несколько полей и очень много данных. Насчёт использования WinAPI с целью создания маленьких программ, скорей всего это обусловлено тем, что когда-то я программировал на ZX-SPECTRUM 48 кб. Так и осталось наверное навечно навязчивая идея что чем меньше программа, тем она быстрее. За пять лет работы с этими велосипедами было выловлено и отлажено очень много багов, постоянная "атака" ошибок сделала своё дело. Теперь я недоверяю абсолютно никакому коду, и каждое внедрение новой функции даётся очень тяжело, постоянно ищу ошибки даже там где их нет и постоянно пересматриваю код от начала до конца. Нажать сочетание клавиш ctrl+F9 чтобы просто посмотреть, а что будет уже не получается так просто, остаётся навязчивая идея об ошибке, а если возможна ошибка значит нужно пересмотреть код. Немного раньше возможно осилил проект в одиночку, но сейчас... Просто нужна уверенность что уже написанный код просто работает и отдохнуть от программиования вообще. Но цель поставлена. |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: нет Всего: 4 |
Я имел ввиду банальные скомпилированные примеры работ вместе с исходниками, чтобы сразу и быстро можно было оценить что это, какие особенности и с чем его едят. Да и если подходит, тогда и разбираться будет проще, всё же голая документация это иногда мало. Вот к примеру меня заинтересовал uLog, но описание слабо даёт понять что это такое, и чтобы понять то ли это, что мне нужно, я вынужден изучать и анализировать исходный код, а простой пример дал бы мне понять что и почем за пару минут. Понимаю, что немного нагло, "даренному коню в зубы не заглядывают", но всё же... |
|||
|
||||
| lexxxSV |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
В разделе документация, на сайте, на данный момент пока нет вообще никакой документации за исключением примера как использовать класс TSingleTable в программе.
Файл ulog.pas представляет из себя независимый класс для ведения логов. И используется он почти также как описано в примере, даже ещё проще:
Т.е. класс создаёт файл log.txt в каталоге C: и помещает в созданный файл сообщение "лог отработал", если создание класса прошло успешно. Для чего здесь нужен бинарник и как он может помочь при изучении работы класса, мне непонятно. |
|||
|
||||
| XperT |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: нет Всего: 4 |
Ну я думал, что это серьезный класс с богатым функционалом, а это, извините, TStringList |
|||
|
||||
| lexxxSV |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 13.6.2012 Репутация: нет Всего: нет |
Это не TStringList и класс на данный момент находится в процессе разработки. По теме: Обновлена внутренняя структура, добавлен функционал для получения полей и перемещения между записями. Функционал для выполнения групповых фильтрации имеется, но не тестирован. |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |