Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 20.06.2020
Сообщений: 2

Чтение больших файлов из blob

20.06.2020, 00:48. Показов 1853. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
var RequestS,urlS:string;
 
begin
   ADOQuery1.Active := false;
   ADOQuery1.SQL.Clear;
   RequestS:= 'SELECT * FROM ['+BaseName.Text+'].[dbo].[(spxml_blobs)] where url = '+ SBResName.Text;
   ADOQuery1.SQL.Add(RequestS);
   ADOQuery1.Active := true;
   if ADOQuery1.RecordCount >0 then
   begin
      ADOQuery1.First;
      urlS:=ADOQuery1.FieldByName('url').AsString;
      urlS:= StringReplace(UrlS, '/','\',[rfReplaceAll, rfIgnoreCase]);
      (ADOQuery1.FieldByName('data') as TBlobField).SaveToFile(ExtractFileName(urlS));
   end;
   ADOQuery1.Active := false;
end;

Если в поле data лежит файл больше 200 метров - ругается, что память переполнена.

Delphi
1
2
MS: TStream;
MS := Adoquery1.CreateBlobStream(adoquery1.FieldByName('data'),bmRead);

Аналогично ругается на переполненную память.

Как сохранить блоб в файл?
В базе хранятся видео. Файлы могут быть больше гига.
Зачем, почему и т.д. - Не я это придумал. Есть свершившийся факт - файлы лежат там, и надо забрать.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.06.2020, 00:48
Ответы с готовыми решениями:

Чтение больших файлов
Всем привет Возник такой вопрос. Допустим, есть какой-то файл в 1 Тб. Если я открываю его для чтения, то получается, что этот файл...

Чтение больших файлов
Всем здрасте. Есть некая программка которая читает построчно текстовый файл, и обрабатывает каждую строку. Всё работает, но есть вопрос....

Чтение в память больших файлов
Привет. Имею след. код: int main(int argc, char* argv) { QCoreApplication a(argc, argv); QFile...

4
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,659
Записей в блоге: 21
20.06.2020, 08:07
в целом порядок действий вроде соблюден
если он дает ошибку, то полагаю, придется лезть в исходник и выяснять, не пытается ли существующий код все засосать разом в память, и можно ли заменить его на TFileStream например
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.06.2020, 11:17
Неправильно делаете. Вы должны из spxml_blobs получить выборку номеров идентификаторов, а не все блобы, а уже потом из выборки, по одному идентификатору за раз, забирать блоб и его обрабатывать.

Добавлено через 14 минут
И кстати какая версия MSSQL? Если не ошибаюсь в MSSQL есть специальный инструментарий для работы с блоб-данными не как с полем, а как с файлом, т.е. его можно открыть и читать небольшими блоками как обычный файл.
0
1 / 1 / 0
Регистрация: 20.06.2020
Сообщений: 2
20.06.2020, 20:28  [ТС]
Delphi
1
(ADOQuery1.FieldByName('data') as TBlobField).SaveToFile(ExtractFileName(urlS));
Если я понимаю правильно (а тесты показывают, что так и есть), показывают, что эта строчка забирает из результатов запроса содержимое блоб-поля из текущей записи а не все блобы разом. Вас могло смутить отсутствие перебора результатов запроса, но в данном конкретном случае перебирать и не нужно. url -ключевое поле, т.е. на запрос
SQL
1
SELECT * FROM [my_table] WHERE url = '....'
я могу получить максимум 1 запись, либо получить ответ, что записей с таким урлом нет.

В процессе отладки - Ошибка переполнения памяти вылетает при любой попытке прочитать блоб-поле, если в нём больше 200 метров. В том числе - при попытке узнать размер поля.

версия скуля - MSSQL std 13.
Я правильно понимаю, что можно запросом прочитать произвольную часть поля в буфер и вы предлагаете читать часть поля, записывать в файл, потом читать следующую часть поля и дописывать файл?
По идее такой вариант подойдёт, но
1. я не знаю, каким запросом можно прочитать часть поля.
2. посчитать размер поля - тоже проблема. дельфой - ошибка про память, скулём - не знаю как.. хотя может гугл подскажет.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,659
Записей в блоге: 21
20.06.2020, 20:46
я же предложил план действий
исходники в наличии
как и показано в первом посте
у класса TBlobField есть метод SaveToFile, который вызывает SaveToStream который вызывает Dataset.CreateBlobStream
и вы можете пойти и отладчиком посмотреть, что же реально происходит
явно же не вы выкачиваете весь блоб в память, а движок
a движков нынче гораздо больше чем один старинный ADO
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2020, 20:46
Помогаю со студенческими работами здесь

Чтение больших файлов в DataGridView
Приветствую вас. Вопрос в том как можно можно отобразить данный из файла большого объёма скажем 1g. в DataGridView при этом не перегружать...

Чтение и обработка больших файлов
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать их сумму. Как это сделать максимально...

Чтение больших файлов Excel
пытаюсь считать данные с XLSX файла (500 000 строк). на MSDN наткнутся на статью каким образом это можно сделать....

Многопоточное чтение больших файлов
Привет всем! Подскажите пожалуйста как реализовать многопоточное чтение файла рамером 1gb и больше без загрузки в память? Пробовал...

Многопоточное чтение больших файлов
Доброго времени суток! Нужен совет. Имеется, скажем, 10 текстовых файлов 1.txt;2.txt и т.д. и метод, которому на вход подаётся строка из...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru