Russian Qt Forum
Ноябрь 27, 2024, 22:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с BLOB большого размера  (Прочитано 4460 раз)
maybe78
Гость
« : Сентябрь 17, 2009, 12:32 »

Использую QSqlTableModel. В базе, в полях BLOB, хранится большое количество файлов по 5мб. Каждый раз при выполнении SELECT запросов эти файлы начинают заполнять оперативную память.
Мне страшно представить, как все это будет тянуться по сетке.

Интересует, возможно ли считывать первые несколько байт BLOB поля, для того чтобы просто определять его наличие в соответствующей ячейке, и при необходимости считывать его целиком?

Или остается просто архивировать поля при загрузке и выгрузке так, чтобы вместо 5 мегабайт они занимали по одному? Но база будет большой, и поэтому такой вариант решения не совсем подходит.

Выручайте, ребята!

база FireBird, если чо

« Последнее редактирование: Сентябрь 17, 2009, 12:39 от maybe78 » Записан
Alp
Гость
« Ответ #1 : Сентябрь 17, 2009, 13:55 »

Может стоит добавить колонку идентификаторы и вычитывать его? Например первые N байт файла пихать в отдельное поле.
Записан
CroCIV
Гость
« Ответ #2 : Сентябрь 17, 2009, 14:17 »

на самом деле. Если есть возможность добавить в таблицу еще одно поле, то можно реализовать так:
1. Добавить битовое поле blob_is_empty.
2. Контролировать моменты вставки, удаления значений в поле BLOB, устанавливая blob_is_empty в 0/1
3. Тянуть запросы из базы без поля BLOB, но с полем blob_is_empty
4. По запросу пользователя для конкретной записи, в соответствии с blob_is_empty вытягивать или не вытягивать из базы значение поля BLOB
Записан
CroCIV
Гость
« Ответ #3 : Сентябрь 17, 2009, 14:33 »

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

SELECT SUBSTRING(blob_column, start, length) FROM ...

где start - смещение в байтах относительно начала
length - число запрашиваемых байт.

Можно ли так в Firebird обращаться, я не знаю, работать не доводилось
Записан
maybe78
Гость
« Ответ #4 : Сентябрь 17, 2009, 19:30 »

CroCIV, спасибо!
Пока обедал сам дошел до решения. Создал в базе столбцы TINYINT в которых хранятся 0 и 1-цы, в зависимости от наличия в соседних колонках записей. И Селект делаю не по всем колонкам, а по всем кроме блоб. К блобам обращаюсь только в случае необходимости.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.136 секунд. Запросов: 21.