Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Огромный размер БД [D7, Absolute Database]


Страницы:   1 2

Сергей Плоткин ©   (2004-08-12 23:45:00) 

Уважаемые знатоки,
Передо мной стоит такая проблема:
На данный момент пишу каталогизатор компакт-дисков. Программа использует базу данных (Absolute Database).

В программе есть процедура сканирования компакт-дисков на предмет файлов и есть таблица "Files", в которую эта процедура записывает каждый файл с выбранного компакт-диска (не сам файл, а его название, конечно), как отдельную строку. В этой таблице 60 колонок (на каждый файл куча параметров - атрибуты, размер, теги мп3, видео-информация, информация о изображениях, архивах и т.п.).

А теперь самое ужасное: закончил работу над процедурой и сделал пробный прогон (до этого запись в таблицу я закомментировал): взял диск с ~ 10000 файлами и запустил. И о'ужас, после добавления в таблицу 9996 файлов, файл базы данных стал занимать 27 мегабайт! Думал, ну может это на первый раз такое, потом меньше будет - запустил еще раз - 56 мегабайт!

Размеры каждой колонки я уже уменьшил, насколько это возможно. PageSize таблицы - 2550 (минимум, просто).

Господа знатоки, помогите пожалуйста, возможно ли как-то существенно уменьшить размер базы данных? Возможно есть встроенное сжатие какое-либо? Ведь 10000 строк текстовой информации должно сильно жаться...

p.s. Программа будет Freeware... Как я в глаза буду смотреть бедным пользователям, которые в обморок упадут после первого отсканированного диска?.. :)


Anatoly Podgoretsky   (2004-08-13 13:31:00) [1]

Нужна нормализация, информация постоянно дублируется, как минимум существуют такие понятия как - диск, альбом, исполнитель, путь, песни (или фильмы - иначе произвеление) и т.д. Поэтому неудивительно, что у тебя очень большой размер. Раздели таблицу на несколько таблиц, как минимум диски и произведения, хотя этого не достаточно.

Другими словами марш за учебники по теории реляционных баз данных.


Iconka   (2004-08-13 13:10:00) [2]


> А ты думаешь, что вынесение папок в отдельную таблицу сильно
> уменьшит размер базы? Вроде, размер основательно уменьшиться
> лишь в том случае, если на диске очень мало папок и очень
> много файлов, лежащих в этих папках...

Да палюбому. У тебя в строке будет хранится имя папки, а не полный путь к ней.


Сергей Плоткин   (2004-08-13 12:19:00) [3]


> Интересно, почему? Религиозные соображения?

Да, нет... Извини, я сначала не так понял, что ты мне предложил. А ты думаешь, что вынесение папок в отдельную таблицу сильно уменьшит размер базы? Вроде, размер основательно уменьшиться лишь в том случае, если на диске очень мало папок и очень много файлов, лежащих в этих папках...


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

Похоже, так и придется сделать...


sniknik   (2004-08-13 12:07:00) [4]

Danilka ©   (13.08.04 11:47) [22]
упс... именно это и имел ввиду.

Сергей Плоткин   (13.08.04 11:50) [24]
> Нет, спасибо... :) Не пойдет...
это ты зря
получится чтото вроде
1, 0, 'D:\Program Files\Borland\Delphi7\MergeModules'
2, 1, 'bdemmcfg.exe'
3, 1, 'DatabaseRTL.Msm'
4, 1, 'DatabaseVCL.Msm'
...
10000, 1, 'TeeChart.Msm'
на самом деле еще хуже ;о), т.к. каждый подкаталог будет отдельно.
прикинь экономию...

> Нет, это не ADS. Вот выдержка из описания: ...
нда, негусто. замени хоть на тот же access с его вар полями отключенным юникодом, выигрыш уже будет.
а в этом слуячае похоже у тебя и пустая запись занимает полный обьем. (наследие dbf ;о))


Danilka   (2004-08-13 11:59:00) [5]

Ну и, конечно-же, нормализация тебя спасет.


Danilka   (2004-08-13 11:55:00) [6]

[24] Сергей Плоткин   (13.08.04 11:50)
> Не пойдет...

Интересно, почему? Религиозные соображения? Ты думаешь в [19] sniknik ©   (13.08.04 11:03) что-то другое написано?


46_55_41_44   (2004-08-13 11:54:00) [7]

Убери все типы aftGraphic ... Зачем тебе хранить в базе изображения??? не понятно...
Если уберешь... то всю твою БД можно подвести к моему вышеописанному методу!


Сергей Плоткин   (2004-08-13 11:51:00) [8]


> Sandman25 ©   (13.08.04 11:49) [23]
> aftString - плохой тип. Особенно если длина 255.
> aftVarString там есть?

В том то и дело, что нет... Есть VarBytes, но я еще не глядел, что это такое...


Сергей Плоткин   (2004-08-13 11:50:00) [9]


> Danilka ©   (13.08.04 11:47) [22]
> я там немного попдробнее написал. :))

Нет, спасибо... :) Не пойдет...


Sandman25   (2004-08-13 11:49:00) [10]

aftString - плохой тип. Особенно если длина 255.
aftVarString там есть?


Danilka   (2004-08-13 11:47:00) [11]


> Можно это как-то поподробнее разъяснить?..

См: [10] Danilka ©   (13.08.04 09:34) я там немного попдробнее написал. :))


Сергей Плоткин   (2004-08-13 11:45:00) [12]


> 46_55_41_44 ©   (13.08.04 08:57) [5]
> Предлагаю тебе ввести собственную кодировку...

Тогда придется отказываться от большинства разнообразных запросов в поиске файлов на диске.


> Anatoly Podgoretsky ©   (13.08.04 09:10) [6]
> см. выше и за счет правильных типов
> полей и смены базы данных.

Программа будет распространяться обычным пользователям. Что мне им, предлагать MS SQL Server ставить, что-ли?..


> Absolute Database это случайно не ADS и ты видимо выбрал
> dBase формат или их сообственный, не серверный.

Нет, это не ADS. Вот выдержка из описания:

- нет DLL (engine базы данных компилируется прямо в EXE-файл)
- поддержка SQL'92 (DDL и DML)
- база данных - в одном файле
- 100% совместимость со стандартными DB-aware элементами управления
- сильное шифрование
- BLOB сжатие
- доступен полный исходный код
- не нужно платить лицензионные отчисления
- бесплатно для персонального использования



> Anatoly Podgoretsky ©   (13.08.04 09:11) [7]
> Приведи так структуру таблицы (таблиц)

Таблица с файлами следующая:

Table.AdvFieldDefs.Add('FileID', aftAutoInc, 10, True);
Table.AdvFieldDefs.Add('CDID', aftInteger, 10);
Table.AdvFieldDefs.Add('CDNumID', aftInteger, 1);
Table.AdvFieldDefs.Add('Filename', aftString, 255);
Table.AdvFieldDefs.Add('FilePath', aftString, 255);
Table.AdvFieldDefs.Add('IsFolder', aftBoolean);
Table.AdvFieldDefs.Add('CreateDate', aftDateTime, 20);
Table.AdvFieldDefs.Add('AccessDate', aftDateTime, 20);
Table.AdvFieldDefs.Add('ChangeDate', aftDateTime, 20);
Table.AdvFieldDefs.Add('ReadOnlyF', aftBoolean);
Table.AdvFieldDefs.Add('HiddenF', aftBoolean);
Table.AdvFieldDefs.Add('ArchiveF', aftBoolean);
Table.AdvFieldDefs.Add('SystemF', aftBoolean);
Table.AdvFieldDefs.Add('Size', aftInteger, 10);
Table.AdvFieldDefs.Add('AppType', aftString, 5);
Table.AdvFieldDefs.Add('AppIcon', aftGraphic);
Table.AdvFieldDefs.Add('ID1Artist', aftString, 30);
Table.AdvFieldDefs.Add('ID1Title', aftString, 30);
Table.AdvFieldDefs.Add('ID1Album', aftString, 30);
Table.AdvFieldDefs.Add('ID1Comment', aftString, 30);
Table.AdvFieldDefs.Add('ID1Year', aftInteger, 4);
Table.AdvFieldDefs.Add('ID1Genre', aftString, 30);
Table.AdvFieldDefs.Add('ID2Artist', aftString, 255);
Table.AdvFieldDefs.Add('ID2Title', aftString, 255);
Table.AdvFieldDefs.Add('ID2Album', aftString, 255);
Table.AdvFieldDefs.Add('ID2Comment', aftString, 255);
Table.AdvFieldDefs.Add('ID2Year', aftInteger, 255);
Table.AdvFieldDefs.Add('ID2Genre', aftString, 255);
Table.AdvFieldDefs.Add('MediaLength', aftInteger, 20);
Table.AdvFieldDefs.Add('MediaBitrate', aftInteger, 5);
Table.AdvFieldDefs.Add('MediaSampleRate', aftInteger, 5);
Table.AdvFieldDefs.Add('MediaMode', aftInteger, 2);
Table.AdvFieldDefs.Add('PictureHeight', aftInteger, 5);
Table.AdvFieldDefs.Add('PictureWidth', aftInteger, 5);
Table.AdvFieldDefs.Add('PictureThumbnail', aftGraphic);
Table.AdvFieldDefs.Add('VideoHeight', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoWidth', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoCodec', aftString, 10);
Table.AdvFieldDefs.Add('VideoLength', aftInteger, 20);
Table.AdvFieldDefs.Add('VideoBitrate', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoFPS', aftInteger, 2);
Table.AdvFieldDefs.Add('VideoAudioBitrate1', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoAudioBitrate2', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoAudioSampleRate1', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoAudioSampleRate2', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoAudioChannels1', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoAudioChannels2', aftInteger, 5);
Table.AdvFieldDefs.Add('VideoThumbnail', aftGraphic);
Table.AdvFieldDefs.Add('IsArchive', aftBoolean);
Table.AdvFieldDefs.Add('ArcAllFileSize', aftInteger, 10);
Table.AdvFieldDefs.Add('ArcAllFileComprSize', aftInteger, 10);
Table.AdvFieldDefs.Add('ArcCurFileRatio', aftInteger, 3);
Table.AdvFieldDefs.Add('ArcCurFileSize', aftInteger, 10);
Table.AdvFieldDefs.Add('ArcCurFileComprSize', aftInteger, 10);
Table.AdvFieldDefs.Add('ArcCurFileHostOS', aftString, 30);
Table.AdvFieldDefs.Add('ArcCurFileCRC', aftInteger, 10);
Table.AdvFieldDefs.Add('ArcCurFileDateTime', aftDateTime, 20);
Table.AdvFieldDefs.Add('ArcCurFileAttributes', aftString, 4);
Table.AdvFieldDefs.Add('CustomComment', aftFormattedMemo);
Table.CreateTable;



> sniknik ©   (13.08.04 11:03) [19]
> сохранение пути тоже можно уменьшить, сделать дерево каталогов,
> аналогично что в реально на диске наблюдаем...
> т.е. каталог и у него дети подкаталоги/файлы в подкаталоге
> то же самое...
> полный путь придется получать собирая всю связку.

Не совсем понял. Можно это как-то поподробнее разъяснить?..


46_55_41_44   (2004-08-13 11:45:00) [13]


> sniknik ©   (13.08.04 11:03) [19]

Во-во... маладес слющий... Тебе пальшой пальшой кафкаский сипасиба!! :)))


sniknik   (2004-08-13 11:03:00) [14]

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


46_55_41_44   (2004-08-13 10:50:00) [15]

вернее все файлы в БД... сорри ))


46_55_41_44   (2004-08-13 10:41:00) [16]

не ругайте пианиста.. он играет как может ))))
Это всего лишь информация... иначе удобнее было бы просто переписать всю базу в бд...
Так что все-таки помоему я прав...
а на счет String да какая разница... String или WideString.. Принцип надо понять!!


Danilka   (2004-08-13 10:30:00) [17]

[14] 46_55_41_44 ©   (13.08.04 10:15)
Возможно, информация о файлах у него занимает места и меньше чем в приведенном тобой примере: 3 890 000, но есть еще и куча другой информации.


Danilka   (2004-08-13 10:27:00) [18]

[14] 46_55_41_44 ©   (13.08.04 10:15)
Во-первых, String может быть и больше 255, во-вторых, полный путь тоже сможет быть больше 255, в третьих, где вот-это: "куча параметров - атрибуты, размер, теги мп3, видео-информация, информация о изображениях, архивах"?


46_55_41_44   (2004-08-13 10:15:00) [19]

Ну это его представление ...
я же предлагаю изменить структуру базы...
а 255 умножаю потому, что String = 0..255
И это самый максимум...
Правда это будет размер лишь одного поля...

В общей сложности будет 3 890 000

Объясняю почему...
FileType - максимум 5 символов 5 * 10 000 = 50 000
FileName - максимум 100 символов... можно и чуть больше - 100 * 10 000 = 1 000 000
FilePath - 255 символов = 255 * 10 000 = 2 550 000 можно и уменьшить в принципе... но берем по максимуму...
FileAttributes - 30 символов - 30 * 10 000 = 300 000
FileSize - 4 байта, если не ошибаюсь... 4 * 10 000 = 40 000

итого

50 000 + 1 000 000 + 2 500 000 + 300 000 + 40 000 = 3 890 000 Bytes

Это просто спонтанная идея... Я не говорю, что ее надо именно применить... просто привожу факты!


Anatoly Podgoretsky   (2004-08-13 09:50:00) [20]

46_55_41_44 ©   (13.08.04 09:25) [8]
Почему ты умножаешь 255 а не 2550, он же точно указал размер


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо