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

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

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

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

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

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

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

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

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

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

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

понял тебя камрад. что же - засучу рукава и поюзаю.
...
Рейтинг: 0 / 0
27.11.2009, 14:16
    #36335757
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
Серж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
27.11.2009, 14:24
    #36335786
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
mrbrooksПрочитал холивар по поводу хранения изображений в БД в виде blob на сайте. Но там речь идет о таком монстре как ms sql server. А как быть с sqlite. К примеру уже имеется изображений почти на 500 Mb. Сейчас в БД у меня хранится ссылка на картинку. Или рациональней все же запихать их в blob?

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

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

что посоветуете? =)
...
Рейтинг: 0 / 0
30.11.2009, 13:40
    #36338839
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
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
30.11.2009, 14:59
    #36339125
mrbrooks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
MBG,

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

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

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

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

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

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

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


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


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


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

Вы бы рассказали, как этого добились :-) На ext3 за 5 лет активного использования в продакшен и тестирования мне такого не удалось сделать, хотя на на винмобайле у юзеров иногда бывает, когда КПК по питанию глючит. У вас случаем ФС не fat32?
...
Рейтинг: 0 / 0
07.12.2009, 14:55
    #36352124
mrbrooks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
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
07.12.2009, 15:22
    #36352209
mrbrooks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
MBG,

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

Так вы нашли самые большие из доступных грабель и прыгнули на них с высоты :-) Возьмите враппер с сайта эскулайт, там есть варианты для разных сред. Сам я работал с эскулайт напрямую, вкомпиливая в сишное приложение, и на tcl, проблем под виндой и винмобайл не было (и это притом, что софт исходно пишется под дебианом, ибо так удобнее).
...
Рейтинг: 0 / 0
08.12.2009, 06:59
    #36353183
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
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
08.12.2009, 07:04
    #36353188
Серж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
Да, забыл добавить что версия 3.6.20 стандартная. Все прагмы по дефолту, кроме двух приведенных.
...
Рейтинг: 0 / 0
08.12.2009, 14:23
    #36354249
mrbrooks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быть с хранением картинок именно в SQLite
MBG, дык я понял - но прихоть не моя. Сам клиент фактически готов и переписывать его под визуальную сишную библу желания нет. :)

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

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

Для запросов делайте "explain query plan select ..." и смотрите, где индексов не хватает.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как быть с хранением картинок именно в SQLite / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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