powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как быть с хранением картинок именно в SQLite
27 сообщений из 27, показаны все 2 страниц
Как быть с хранением картинок именно в SQLite
    #36334826
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прочитал холивар по поводу хранения изображений в БД в виде blob на сайте. Но там речь идет о таком монстре как ms sql server. А как быть с sqlite. К примеру уже имеется изображений почти на 500 Mb. Сейчас в БД у меня хранится ссылка на картинку. Или рациональней все же запихать их в blob?

Какие ваши мнения?
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36334904
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrbrooks,

1) По умолчанию размер записи в sqlite 1 МБ. Или картинка должна быть меньше 1МБ или пересобирать dll.

2) Что с этими картинками делать потом? Т.е. как обрабатывать? Если они в конечном счете все равно файлами нужны, то наверное лучше сразу файлами и хранить, иначе получится цепочка "достать из базы, сохранить во времен. директории, отдать файл". Если нужно в памяти обрабатывать, то можно и в базе хранить.

3) Что там по производительности получится в обоих случаях не знаю, надо замерять.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36334929
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сержmrbrooks,

1) По умолчанию размер записи в sqlite 1 МБ. Или картинка должна быть меньше 1МБ или пересобирать dll.

2) Что с этими картинками делать потом? Т.е. как обрабатывать? Если они в конечном счете все равно файлами нужны, то наверное лучше сразу файлами и хранить, иначе получится цепочка "достать из базы, сохранить во времен. директории, отдать файл". Если нужно в памяти обрабатывать, то можно и в базе хранить.

3) Что там по производительности получится в обоих случаях не знаю, надо замерять.

1. Я работаю через net connector. Надо будет покурить по этому поводу мануал к нему. Но 1 Mb достаточно.

2. Картинки чисто для превью. Выходит с этой точки зрения кошернее хранить в БД.

3. Вот и я о чем =). Как то ради спортивного интереса влом заводить в БД более 3000 изображений. =)
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36335045
Игорь Сойников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сохраняю картинки в BLOB. Работаю с iPhone проверял до 12000 PNG 480x320,
отклик системы заметно быстрее, чем при считывании файла.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36335071
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игорь СойниковЯ сохраняю картинки в BLOB. Работаю с iPhone проверял до 12000 PNG 480x320,
отклик системы заметно быстрее, чем при считывании файла.

понял тебя камрад. что же - засучу рукава и поюзаю.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36335757
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
Сержmrbrooks,

1) По умолчанию размер записи в sqlite 1 МБ. Или картинка должна быть меньше 1МБ или пересобирать dll.


Обманываете. Смотрим http://www.sqlite.org/limits.html
Код: plaintext
1.
The maximum number of bytes in a string or BLOB in SQLite is defined by the preprocessor macro
SQLITE_MAX_LENGTH. The default value of this macro is 1 billion (1 thousand million or 1,000,000,000)
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36335786
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksПрочитал холивар по поводу хранения изображений в БД в виде blob на сайте. Но там речь идет о таком монстре как ms sql server. А как быть с sqlite. К примеру уже имеется изображений почти на 500 Mb. Сейчас в БД у меня хранится ссылка на картинку. Или рациональней все же запихать их в blob?

Какие ваши мнения?

Зависит от ситуации. Если картинки более 16 кБ каждая, лучше на диске, если меньше, можно настроить размер страницы БД и хранить в ней. Если у вас ФС ext3, то можно хранить на диске, а если что-то из виндовых - лучше хранить в БД. Если у вас высокая интенсивность обновления, лучше на диске, иначе база может оказаться [почти] непрерывно залочена. Что касается производительности - тестировал хранение 100 миллионов картинок размером 1 кБ (превью) в базе, получил базу на 100 Гб, все ок. Разумеется, в таблице должно быть только одно поле - сам blob, всю остальную инфу необходимо хранить в другой таблице/таблицах (это нужно для обеспечения высокого быстродействия).
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36336533
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGОбманываетеА ведь верно. Цифра в 1мб засела в голове со времен версий 2.х
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36338324
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,
картинки в среднем от 300 до 600 кб.
ось - винда.
обновление - если только при редактировании записи.

что посоветуете? =)
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36338839
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksMBG,
картинки в среднем от 300 до 600 кб.
ось - винда.
обновление - если только при редактировании записи.

что посоветуете? =)

Я бы хранил в эскулайт базе. Виндовые ФС это что-то с чем-то, не зря гугл эф и многие другие приложения используют именно единый файл собственного формата для хранения изображений. Хранить, например, так:

create table photo (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
body blob
);

CREATE TABLE photo_meta
(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
save_date REAL,
delete_date REAL,
user_id integer NOT NULL,
name text collate russian NOT NULL,
size integer NOT NULL DEFAULT 0,
checksum text NOT NULL DEFAULT ''
);

Т.к. СУБД у нас с построчным хранением, то извлечение любого поля требует прочитать всю строку целиком, так что, если хранить блобы вместе с описанием файлов, то любые операции с такой таблицей станут очень неэффективны. Разумеется, в приведенном выше варианте значения поля id должны совпадать в обеих таблицах. Ключевое поле определено так, что идентификатор не может повторяться, даже если соотвествующая запись была удалена из таблицы - это удобно для репликации и восстановления случайно удаленного из дампов; если вам это не нужно, то можно чуть ускорить вставку, отказавшись от уникальности ключа. Поле delete_date позволяет вместо физического удаления просто помечать записи как удаленные, их можно легко восстановить.

Эскулайт поддерживает incrblob API, позволяющие потоково работать с блобами, но в вашей задаче вряд ли это нужно. Впрочем, см. http://sqlite.org/tclsqlite.html#incrblob и сишный интерфейс.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36339125
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

Спасибо. Буду организовывать хранение картинки в БД.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36339181
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksMBG,

Спасибо. Буду организовывать хранение картинки в БД.

Установите pragma page_size как минимум в 4 Кб, а то будете удивляться, почему медленно работает :-) К примеру, у постгреса по дефолту 8 Кб, а у эскулайт - 1 Кб. Притом увеличение с 1к до 4к дает 3-х кратный выигрыш производительности (увеличивать далее есть смысл, когда нужно хранить именно блобы). Можно и 32к попробовать, в рассылке эскулайта говорили, что для блобов на компакт-дисках самое то (под линуксом пробовал, разницы не видно, а под виндой не смотрел).
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36340224
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG
Установите pragma page_size как минимум в 4 Кб, а то будете удивляться, почему медленно работает :-)

Вот с этим сложнее ). Работаю через net.connector
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36341122
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksMBG
Установите pragma page_size как минимум в 4 Кб, а то будете удивляться, почему медленно работает :-)

Вот с этим сложнее ). Работаю через net.connector

Разве в нем нет возможности произвольные sql-запросы выполнять? Даже если так, то что мешает открыть базу через эскулайт шелл и настроить? Хинт: если база не пустая, то после установки этой прагмы нужно сделать vacuum.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36341621
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

был не прав. нашел в строке подключения к БД вот это:
автор
SQLiteConnectionStringBuilder.PageSize;
Gets/Sets the page size for the connection.


Подозреваю оно и есть. Опробуемс.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36351577
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,
сделал:
Код: plaintext
1.
2.
pragma page_size= 8192 ;
vacuum;
analyze;


теперь появляется мессага авторThe database disk image is malformed
и собственно все.
Хорошо что хоть бэкап сделал. Гы.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36351713
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksMBG,
сделал:
Код: plaintext
1.
2.
pragma page_size= 8192 ;
vacuum;
analyze;


теперь появляется мессага авторThe database disk image is malformed
и собственно все.
Хорошо что хоть бэкап сделал. Гы.

Вы бы рассказали, как этого добились :-) На ext3 за 5 лет активного использования в продакшен и тестирования мне такого не удалось сделать, хотя на на винмобайле у юзеров иногда бывает, когда КПК по питанию глючит. У вас случаем ФС не fat32?
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36352124
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBGmrbrooksMBG,
сделал:
Код: plaintext
1.
2.
pragma page_size= 8192 ;
vacuum;
analyze;


теперь появляется мессага авторThe database disk image is malformed
и собственно все.
Хорошо что хоть бэкап сделал. Гы.

Вы бы рассказали, как этого добились :-) На ext3 за 5 лет активного использования в продакшен и тестирования мне такого не удалось сделать, хотя на на винмобайле у юзеров иногда бывает, когда КПК по питанию глючит. У вас случаем ФС не fat32?

Никакого секрета нет =) Результат один - как через ado.net так и через админскую прогу - sqlite expert - выполняю приведенный выше запрос и аллес капут. фс - ntfs. я сейчас попробую на голой базе это попробывать. и если все гуд - импортировать данные. по результату отпишусь.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36352209
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

Разобрался методом проб и ошибок. Оказывается БД портилась из-за того что я выполнял все действия в запароленной БД. Стоило мне поменять пароль на пустой - все прошло на ок - затем можно без проблем вернуть пароль обратно. Во как.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36352357
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем при обращении к базе в 180 мб гнется все что может. Учитывая положительные отзывы о SQLlite грешу только на сам ADO.NET. Это просто не реально хранить в БД картинки. Даже не обращаясь к самой таблице с изображениями тормоза неимоверные. Остановлюсь на варианте хранения на диске. Все достаточно быстро.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36352779
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksв общем при обращении к базе в 180 мб гнется все что может. Учитывая положительные отзывы о SQLlite грешу только на сам ADO.NET. Это просто не реально хранить в БД картинки. Даже не обращаясь к самой таблице с изображениями тормоза неимоверные. Остановлюсь на варианте хранения на диске. Все достаточно быстро.

Так вы нашли самые большие из доступных грабель и прыгнули на них с высоты :-) Возьмите враппер с сайта эскулайт, там есть варианты для разных сред. Сам я работал с эскулайт напрямую, вкомпиливая в сишное приложение, и на tcl, проблем под виндой и винмобайл не было (и это притом, что софт исходно пишется под дебианом, ибо так удобнее).
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36353183
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrbrooksв общем при обращении к базе в 180 мб гнется все что может. Учитывая положительные отзывы о SQLlite грешу только на сам ADO.NET. Это просто не реально хранить в БД картинки. Даже не обращаясь к самой таблице с изображениями тормоза неимоверные. Остановлюсь на варианте хранения на диске. Все достаточно быстро.

Стало интересно... Недолго думая, создал следующую структуру:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE "files" (file_id INTEGER PRIMARY KEY AUTOINCREMENT, f
ilename VARCHAR NOT NULL, filesize INTEGER NOT NULL, 
added DATETIME NOT NULL DEFAULT current_timestamp)

CREATE TABLE "blobs" (file_id INTEGER NOT NULL, image BLOB)

CREATE UNIQUE INDEX FK_file_id ON blobs (file_id)

CREATE INDEX IX_filesize ON files (filesize)

Файлов под рукой было фотографий 400 с хвостом штук (от 600кб до 1900кб). И около 4000 всяких разных пиктограмм. Они понятное дело мелкие.

Залил их все в базу несколько раз, чтобы объемы нагнать. Результаты следующие:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
 08 . 12 . 2009    10 : 36         498   606   080  image_test.db

pragma page_size;
PRAGMA default_cache_size;

page_size 
--------- 
 4096       

cache_size 
---------- 
 8000        


select count(*), min(filesize), max(filesize), avg(filesize) from files;
select count(*) from blobs;

count(*) min(filesize) max(filesize) avg(filesize)    
-------- ------------- ------------- ---------------- 
 10743      103             1924095         46065 , 0582705017  

count(*) 
-------- 
 10743     


select * from files;
 2 . 422  сек (включая выборку)


select b.* from blobs b  join files f on f.file_id = b.file_id order by f.filesize DESC limit  100 ;
 1 -й вызов  12 . 365  сек (включая выборку)
 2 -й вызов  1 . 093  сек (включая выборку)

Программа после каждого запроса закрывает соединение. 
Т.е. получается второе время - результат кэширования файловой системы.

select b.* from blobs b  join files f on f.file_id = b.file_id order by f.filesize ASC limit  100 ;
 0 . 047  сек (включая выборку) 

Этот запрос всегда выполняется с такой скоростью +- 20мс.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36353188
Серж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл добавить что версия 3.6.20 стандартная. Все прагмы по дефолту, кроме двух приведенных.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36354249
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG, дык я понял - но прихоть не моя. Сам клиент фактически готов и переписывать его под визуальную сишную библу желания нет. :)

Серж, спасибо за интересный тест. Меня тоже озадачили мои результаты. Ибо что админская прога, что работа из VS (причем под используемым коннектором) давали достаточно неплохие результаты. Значит трабла со стороны моего клиента однозначно. Путем вылизывания строки подключения добился сносных результатов. На машине 2,4 GH P4 512 ОЗУ время на возврат всех записей составило порядка 8 секунд + секунд 20 на прорисовку быдлогуя. Однако уже на машине 1,7 GH P4 512 ОЗУ - порядка 68 секунд + плюс столько же на быдлогуй =) Это уже хуже. Хотя по сравнению с тем, что творилось вчера - это прогресс.
Буду оттачивать подключение.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36355545
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
mrbrooksMBG, дык я понял - но прихоть не моя. Сам клиент фактически готов и переписывать его под визуальную сишную библу желания нет. :)

Серж, спасибо за интересный тест. Меня тоже озадачили мои результаты. Ибо что админская прога, что работа из VS (причем под используемым коннектором) давали достаточно неплохие результаты. Значит трабла со стороны моего клиента однозначно. Путем вылизывания строки подключения добился сносных результатов. На машине 2,4 GH P4 512 ОЗУ время на возврат всех записей составило порядка 8 секунд + секунд 20 на прорисовку быдлогуя. Однако уже на машине 1,7 GH P4 512 ОЗУ - порядка 68 секунд + плюс столько же на быдлогуй =) Это уже хуже. Хотя по сравнению с тем, что творилось вчера - это прогресс.
Буду оттачивать подключение.

Для запросов делайте "explain query plan select ..." и смотрите, где индексов не хватает.
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36359365
mrbrooks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG,

да не. с индексами все ок. тормозило в первую очередь от былогуя - вернее от неправильного его заполнения мною, ибо грузил сразу все =) выход - использовать так называемый paging.

Кстати интересно вот что - возьмем за пример предыдущие таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table_photo (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
body blob
);

CREATE TABLE photo_meta
(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
save_date REAL,
delete_date REAL,
user_id integer NOT NULL,
name text collate russian NOT NULL,
size integer NOT NULL DEFAULT  0 ,
checksum text NOT NULL DEFAULT ''
);

тогда запрос (упрощенно)
Код: plaintext
select * from photo_meta, table_photo where photo_meta.id = table_photo.id 
сработает очень быстро. однако данные выходят не отсортированные. Стоит только поменять на
Код: plaintext
select * from photo_meta, table_photo where photo_meta.id = table_photo.id order by photo_meta.id
результат заставляет себя долго ждать :)
...
Рейтинг: 0 / 0
Как быть с хранением картинок именно в SQLite
    #36359736
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mrbrooksрезультат заставляет себя долго ждать :)Ну так это естественно.
Сначала делаем виртуальную таблицу которая уже содержит блобы, а потом ее сортируем. При этом блобы естественно будут сортироваться тоже...
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как быть с хранением картинок именно в SQLite
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]