Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi и базы данных
Войти
Регистрация
Восстановить пароль
 
 
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
#1

Запись в Mssql BLOB: как обойтись без Filestream? - Delphi БД

10.10.2016, 07:57. Просмотров 1159. Ответов 23

Доброго времени суток форумчане.
У меня обновление программы реализовано через скачивание из БД ms sql 2008 r2 новой версии программы в виде zip с дальнейшем разархивированием.
Есть своя программка записи программы в БД blob.
Раньше всё работало хорошо, но когда в состав обновления добавил разные файлы и суммарный объём стал 400-500 Mb загрузчик в БД стал переполнять память.
Проблема выяснилась в том что для записи в Blob поле архив загоняю в filestram (классический рецепт взят на просторах форума), т.е. как я понял при создании файлпотока файл создаётся в памяти и мдёт её переполнение (>1200 mb).
Как обойти открытие в файлпотоке для записи в БД.
По сути это вопрос записи больших файлов в blob БД.
Спасибо.
P.S. Сейчас спасает использование 64 разр версии с 4 гб оперативной памяти, но на долго ли это.
P.S. Считывание из БД сразу в файл работает без запинок.
http://www.cyberforum.ru/delphi-database/thread1236743.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2016, 07:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запись в Mssql BLOB: как обойтись без Filestream? (Delphi БД):

не как без вас не обойтись
1.Нужно выразить из формулы s=v*t-(at*t)/2 переменную. t 2.Как преобразовать...

Как обойтись без условных переходов?
И снова здравствуйте. Еще интересует чем можно заменить условные переходы...

Можно ли обойтись без явной конвертации в коде?
Доброго времени. Существуют ли настройки сервера и/или подключения которых...

Запись Blob в БД
Избитая тема, знаю, но не выходит. Дано: БД interbase, таблица с тремя...

Запись файла в BLOB
народ, помогите составить код, в firebird работает все прелесть, хотелось бы...

23
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,590
10.10.2016, 09:02 #2
может тут
Цитата Сообщение от вольдемар Посмотреть сообщение
суммарный объём стал 400-500 Mb
что то изменить?

вы считаете что обновление ПО может требовать 500 метров?
0
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
10.10.2016, 09:03 #3
Вас спасет работа с каждой строчкой таблицы и запись в Blob поле построчно.
Вы же не пишете в КАЖДОЙ ячейке по 400-500 метров?
0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
10.10.2016, 14:59  [ТС] #4
Удивительно что на форуме часто первые ответы это пожелания улучшить код а не ответ.
Да обновление надо. Однократное. Я добавит к проге набор библиотек и кэш гео карт, в последствии могу updatов делать легче, так как карты часто обновлять не надо, а может и надо. Вам от этого какое дело?

Добавлено через 2 минуты
MyEternity, ячейка одна, на одну версию и в нё заносится сам апдейт в бинарном виде. Что значить построчно?
0
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
10.10.2016, 15:02 #5
MSSQL это база данных.
В ней таблицы.
В таблицах строки.

Мой вопрос был в том - в одной строке у вас или в нескольких blob поле?
0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
10.10.2016, 15:05  [ТС] #6
MyEternity, в одной строке одна ячейка с одним блоб полем в которое пишется монофайл zip с апдейтом
Вопрос по сути в записи больших бинарных данных в блом минуя Filestream.
0
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
10.10.2016, 15:40 #7
Тогда
1. Есть вариант записывать BLOCB из файла на сервере - через хранимую процедуру.
2. Либо писать в BLOB по частям через тот же самый tFileStream;
0
virtual[ity]
156 / 136 / 63
Регистрация: 05.06.2010
Сообщений: 610
10.10.2016, 15:42 #8
Каждая новая строка в БД = новой версии ПО, в которой есть blob поле для хранения файлов этой новой версии?
Я правильно пример привел?
Version| Vers_Info | Update_File
0.0.1. Новый Btn v0.0.1.zip
0.0.2. Новый Grid v0.0.2.zip

Не по теме:


Насколько знаю, что файлы обновления на FTP находятся, а в БД ссылка на них только хранится. Могу ошибаться.

0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
10.10.2016, 15:45  [ТС] #9
virtual[ity], верно. Версия название и сам файл.
0
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,590
10.10.2016, 16:21 #10
Цитата Сообщение от вольдемар Посмотреть сообщение
Вам от этого какое дело?
да нам то никакого - это у вас проблема

Цитата Сообщение от вольдемар Посмотреть сообщение
Я добавит к проге набор библиотек и кэш гео карт
библиотеки это dll?

а кэш карт в каком виде? в mssql есть новый тип geography - можно в нем координаты хранить, еще можно пожать эти данные - есть такая штука.

вы сами то что хотите сделать?
0
BOGG ART
576 / 444 / 146
Регистрация: 09.12.2013
Сообщений: 2,384
Записей в блоге: 2
10.10.2016, 16:28 #11
Я так понял у него в БД в какой-то таблице есть колонка BLOB.
Надо загружать в БД и скачивать из БД файлы размером например в 5GB. А оперативки всего 1GB. А винда 32bit.
0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
10.10.2016, 17:23  [ТС] #12
BOGG ART, ну хоть один человек понимает о чём идёт речь.
qwertehok, спасибо милый человек! а я и не знал что у меня проблема с размером обновления думал просто не хочет работать не
О да! У меня Dll. (Тут я много язвил но удалил)
Кэш в виде png. Работа в основном оффлайн иначе я бы сам поднял сервер Тайлов и прогой погружал бы.
Пожать бинарные png это "есть такая штука" - сначала дождаться ответа в каком формате данные потом советовать ужать.
А на вопрос чего хочу я просьба СМ п.1.
Для ленивых: Запись файла размером больше 1 гб в поле Blob при условии использования ос 32bit и ограничения загрузки памяти при создании filestream.
0
qwertehok
10.10.2016, 17:34
  #13

Не по теме:

Цитата Сообщение от вольдемар Посмотреть сообщение
хоть один человек понимает о чём идёт речь.
да поняли то все

но вы сами себе злобный буратино, кто же пихает 500 метров в бд при таких ресурсах?
еще напишите что sql у вас express

я вам предлагал варианты, а вы по прежнему на свой костыль надеетесь

0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
10.10.2016, 17:56  [ТС] #14
По теме на ваше не по теме:
Ваш совет 1.
Вариант с Mssql геокоординаты это круто, то что в постгресе есть и в MySQL допили включая постраничный вывод. Да, но! Мне не координаты надо хранить а Тайлы! Кэш карт.
Как я сказал иногда пользователь подключается и видит обновление (кстати при сети в 1 гб и рэйд сервере даже express вертится отлично так как работа на триггерах и хранимках то вообще не перегружается.
Ваш совет 2
Сжатие бинарных данных (png невозможно).
Еслбы вы предложили что то я бы с удовольствием подумал об этом, но нечего.
Давайте подумаем:
1. Разместить в сетевой шаре файл и тхт с номером версии - неплохо но каждому пользователю надо настраивать доступ к шаре.
2. Web ресурс надо добавлять каждого пользователя во все фигни для контроля что бы его не блочили.
У меня 5-7 прожектов и все обновляются через БД или раб с БД на прямую.
Я бы и сам с удовольствием оптимизировал код, но он пока такой какой есть. И проблема не в коде а текущей необходимости обойти ограничение в 1 Gb. Если BLOB создан, значит он кому то нужен и Delphi должен в него писать, я в это верю, просто пока не умею это делать.

Добавлено через 7 минут
Этот мой апдейт разовый и сами понимаете в след версиях могу и откат сделать с удалениями карт, это можно всегда сделать. По хорошему свой тайл сервер нужен но как говорится всё пока работает не трогай.
0
qwertehok
2195 / 2185 / 597
Регистрация: 29.08.2013
Сообщений: 14,590
10.10.2016, 20:47 #15
Цитата Сообщение от вольдемар Посмотреть сообщение
Да, но! Мне не координаты надо хранить а Тайлы! Кэш карт.
в первом сообщении этого нет
Цитата Сообщение от вольдемар Посмотреть сообщение
Сжатие бинарных данных (png невозможно).
в первом сообщении этого нет

Цитата Сообщение от вольдемар Посмотреть сообщение
неплохо но каждому пользователю надо настраивать доступ к шаре.
зачем? создать 1 раз группу и дать доступ группе
Цитата Сообщение от вольдемар Посмотреть сообщение
И проблема не в коде а текущей необходимости обойти ограничение в 1 Gb
КАК??????

Цитата Сообщение от вольдемар Посмотреть сообщение
кстати при сети в 1 гб и рэйд сервере даже express вертится отлично так как работа на триггерах и хранимках то вообще не перегружается.
бред, у экспресса ограничение на 1 проц, 1 гиг памяти и 10 гигов места

как вариант - разбейте свой архив на 2\3\4\5 частей и доставайте их во временную папку
0
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
11.10.2016, 22:18 #16
Цитата Сообщение от вольдемар Посмотреть сообщение
Мне не координаты надо хранить а Тайлы! Кэш карт.
Ну разбейте свои тайлы по геозонам. И храните не по 500 мегов, а по 1-5 метров.
У вас ошибка в архитектуре БД и вы пытаетесь на нее суперкомпьютер натянуть...
1. Обвиняя Delphi в том, что он компилирует exe/dll файлы которые почему-то не могут пропахать 100 гиг в оперативке 1 гиг.
2. Обвиняя форумчан, которые мягко пытаются до вас донести: "это ересь какая-то", что они ничего не понимают.
0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
11.10.2016, 22:51  [ТС] #17
MyEternity, если есть пожелания по улучшению моего кода то сначала должен быть ответ на конкретный вопрос (например: нет это не возможно так как Delphi не поддерживает ....), а потом предлагайте вариант улучшения кода.
Если бы я имел возможность уйти от этого, то я бы изучил web технологии и более не связывался с Delphi. Но задача такова какова она есть.
1. Есть более сложный проект который генерит KML который отображается на google earth с кэшем в 10 Gb без каких либо баз но я же не говорю что вот это надо обновлять.
2. А если Delphi не может записать в ms sql данные в поле Блоб, то стоит пересмотреть концепт и уйти от Delphi.
Под каждую задачу свой инструмент. Если Delphi не может записать блоб 500 Мб значит этот инструмент в данном случае не годится. (Поле лоб, если я не ошибаюсь, можно писать до 1-2 Гб.)
3. на данный момент при использовании загрузчика обновления в исполнении x64 (как я указывал раньше) программа таки работает и пишет в блоб, просто это требует обязательной поддержки машиной с которой закидывается апдейт x64.
4. Говнокодить и разбивать на части по 100Мб потом собирать о обновлять это вариант, но опять же ВОПРОС БЫЛТЗАДАН ПО ОДНОМУ а советуете вы по другому.
qwertehok,
Цитата Сообщение от вольдемар Посмотреть сообщение
Да, но! Мне не координаты надо хранить а Тайлы! Кэш карт.
в первом сообщении этого нет
От вас этого в 1 сообщении и не требовалось, в ходе переписки мною были даны разъяснения так как вам очень хотелось узнать чем я нагружаю апдейт.
Цитата Сообщение от вольдемар Посмотреть сообщение
Сжатие бинарных данных (png невозможно).
в первом сообщении этого нет
Я не просил у вас совета по сжатию и оптимизацию апдейта.
Цитата Сообщение от вольдемар Посмотреть сообщение
И проблема не в коде а текущей необходимости обойти ограничение в 1 Gb
КАК??????
ВОТ Я И СПРОСИЛ КАК???
Цитата Сообщение от вольдемар Посмотреть сообщение
кстати при сети в 1 гб и рэйд сервере даже express вертится отлично так как работа на триггерах и хранимках то вообще не перегружается.
бред, у экспресса ограничение на 1 проц, 1 гиг памяти и 10 гигов места
Ограничение экспресса вполне позволяет всему отлично вертеться.
Поясню:
Сама база на текущий момент весит всего примерно 300 мб так как всё на уровне Delphi оптимизируется а избыточные данные спец образом сшиваются на уровне триггеров, и если бы не глюк Delphi или ms sql (пока не разбирался почему разница между 00:01 и "вчерашним" 23:59 >5 минут) записей было бы ещё меньше. Выгрузить из базы монофайл из блоба в 500 мб это как считать с диска и ограничение в 1cpu 1 Gb и уж тем более 1 Gb никак не мешает работе.
0
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
11.10.2016, 22:59 #18
Вы невнимательно читали.
Инструмент (читайте: Delphi) ни при чем.

На всякий случай повторюсь:
Цитата Сообщение от MyEternity Посмотреть сообщение
У вас ошибка в архитектуре БД и вы пытаетесь на нее суперкомпьютер натянуть...
И Delphi тут совершенно ни при чем. Пишите на C# тоже самое и будет работать ТОЧНО ТАКЖЕ.

Добавлено через 59 секунд
Цитата Сообщение от вольдемар Посмотреть сообщение
глюк Delphi
Delphi это инструмент. Как молоток. Он не виноват, если вдарил по яйцам.
0
вольдемар
2 / 2 / 1
Регистрация: 30.01.2012
Сообщений: 25
11.10.2016, 23:07  [ТС] #19
Тему считаю закрытой из за невозможности форумчан ответить на чёткий вопрос.
Прийдётся самому влезать в это дело.
Ошибки в Архитектуре нет. БД отлично со всем справляется. Всё спотыкалось в метод обновления, хотя раньше не спотыкалось и на протяжении года отлично обновлялось.
Сама прога и БД и прочие инструменты, включая инструменты её наполнения работают исправно.
С "глюком" позже разберусь так как он по своему дал небольшую помощ при визуализации статистики и пока даёт приращение + 80% лишних данных в БД, что несущественно в текущих объёмах, а процедурой пройтись всегда можно.
0
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
11.10.2016, 23:11 #20
Цитата Сообщение от MyEternity Посмотреть сообщение
1. Есть вариант записывать BLOCB из файла на сервере - через хранимую процедуру.
Пишете на MSSQL хранимку, кладете ваш обожаемый 500-метровый файл куда надо (Абсолютный путь на сервере MSSQL: C:\WinSrv 2012 x32.iso), и запускаете хранимку

В хранимке примерно вот такой код:
SQL
1
INSERT INTO @TABLE (rn, img) SELECT 'my_super_FAT_blob_file' ,(SELECT * FROM OPENROWSET(BULK N'C:\WinSrv 2012 x32.iso', SINGLE_BLOB) AS [File])
И будет вам счастье.
0
11.10.2016, 23:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2016, 23:11
Привет! Вот еще темы с решениями:

Файлы из BLOB открыть (без save)
Как не сохраняя на диск открыть файл из BLOBа в соответствующем приложении,...

Запись в поле BLOB файла rtf из RichEdit
Приветствую. Как можно записать в ячейку таблицы BLOB данные из RichEdit в ...

Запись массива в БД MSSQL
Не уверен, верно ли задам вопрос, но попробую изъясниться:scratch: Дан массив:...

Как добавить запись в таблицу без сохранения
Есть DBGrid с таблицей из БД. В нем можно редактировать записи и добавлять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru