![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Огромный размер БД [D7, Absolute Database]
Сергей Плоткин © (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, он же точно указал размер