Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Техническая спецификация на официальном сайте и максимальный размер BLOB'а / 25 сообщений из 48, страница 1 из 2
14.03.2020, 22:26
    #39937472
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
На официальном сайте в технической спецификации ( https://firebirdsql.org/en/firebird-technical-specifications ) сказано, что максимальный размер BLOB'а - 32 ГБ.
При этом в pdf-документации и для 2.5 и для 3 написано, что максимальный размер - 4 ГБ.
Скорее всего, ограничение 32 - это имеется в виду ограничение самого типа данных , а не конкретной реализации этого типа в СУБД. По хорошему надо хотя бы в комментарии сказать и не вводить людей в заблуждение. Программисту сказать - сам дурак, документацию не читал - можно, а вот, например, коммерсанту, выбирающему продукт - нельзя.

А вообще, это замечание навеяно тем, что я не могу скачать с помощью FireDAC даже файл 2.78 GB. Топик в соседнем форуме.

P.S. А вот успешно загружаю и 7 ГБ и даже больше.
...
Рейтинг: 0 / 0
14.03.2020, 23:20
    #39937485
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos
P.S. А вот успешно загружаю и 7 ГБ и даже больше.

Как ты узнал, что "успешно"?
...
Рейтинг: 0 / 0
14.03.2020, 23:24
    #39937486
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
размер да 32 Гб. Но при таком размере не все функции работают. Там какие проблемы были с определением размера блоба, и с потоковыми блобами есть проблемы.
...
Рейтинг: 0 / 0
14.03.2020, 23:28
    #39937487
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
Симонов Денис,

Так, может, настало время таки разобраться, и даже, не побоюсь смелости этого предложения, полечить?))
...
Рейтинг: 0 / 0
14.03.2020, 23:40
    #39937489
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
ъъъъъ,

Сделал бэкап-рестор, выполнил валидацию.
...
Рейтинг: 0 / 0
15.03.2020, 00:16
    #39937493
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos
ъъъъъ,

Сделал бэкап-рестор, выполнил валидацию.


И таким образом ты понял, что данные (блобы > 7 Гб) оказались в базе?
...
Рейтинг: 0 / 0
15.03.2020, 00:34
    #39937495
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
ъъъъъ,

По размеру файла базы.
...
Рейтинг: 0 / 0
15.03.2020, 01:28
    #39937500
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos,
вообще, размер блоба ограничен размером страницы БД.
В доке написано, что для размера страницы 4к лимит это 2 гиг блоба (524к страниц по 4к).
Ссылки на блоб, насколько я в курсе, 64битные (4 байта)
https://www.firebirdsql.org/pdfmanual/html/fbint-page-5.html
https://www.firebirdsql.org/pdfmanual/html/fbint-page-8.html
При этом, если на страницу данных блоб не влазит, туда ставятся ссылки на страницы блобов.
По идее, на страницу 16к влазит чуть меньше чем 256 ссылок. Ссылки могут быть на страницы блобов уровня 1, где либо данные либо опять ссылки, которые ссылаются на уровень 2, где уже сами блобы.
Простым подсчетом у меня как-то не очень получается, типа 256 ссылок * 256 ссылок * 16384 = 1 гиг. Что-то я не то считаю...
...
Рейтинг: 0 / 0
15.03.2020, 10:55
    #39937522
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos
ъъъъъ,

По размеру файла базы.

Оставь на время FireDAC, проведи опыт по выкачиванию, якобы закачанного, на IBX. Сравним результаты.
...
Рейтинг: 0 / 0
15.03.2020, 10:58
    #39937523
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
kdvСсылки на блоб, насколько я в курсе, 64битные (4 байта)

64 бита - это 8 байт
...
Рейтинг: 0 / 0
15.03.2020, 12:09
    #39937533
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
Vlad F,

Ответил в исходной теме. Результаты интересные, похоже использование ISC API напрямую мне не поможет.
...
Рейтинг: 0 / 0
15.03.2020, 12:20
    #39937534
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos
похоже использование ISC API напрямую мне не поможет
Ты его не правильно используешь. Не нужно ориентироваться на длину блоба (тут есть проблемы, да), нужно просто читать его до упора.
...
Рейтинг: 0 / 0
15.03.2020, 12:31
    #39937543
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
Симонов Денис,

упс. тогда 512*512*16384 = 4 гиг.
для 8к - 256*256*8192 = 0,5 гиг
для 4к - 128*128*4096 = 67мб.
что-то не сходится.
...
Рейтинг: 0 / 0
15.03.2020, 12:36
    #39937545
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
hvlad,

Так его используют компоненты доступа IBX.

При вызове напрямую можно попробовать читать до упора. Есть пример использования ISC API на Delphi?
Понятно, что таким примером является сам IBX.IBIntf.pas или FireDAC.Phys.IBWrapper.pas/FireDAC.Phys.IBCli.pas, но из них сложно сделать минимальный пример.

Я нашел только на C++ и они требуют зависимость от C:\Program Files (x86)\Firebird\Firebird_2_5\include и C:\Program Files (x86)\Firebird\Firebird_2_5\lib.
...
Рейтинг: 0 / 0
15.03.2020, 12:46
    #39937546
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos
Есть пример использования ISC API на Delphi?
Понятно, что таким примером является сам IBX.IBIntf.pas или FireDAC.Phys.IBWrapper.pas/FireDAC.Phys.IBCli.pas, но из них сложно сделать минимальный пример.

Я нашел только на C++ и они требуют зависимость от C:\Program Files (x86)\Firebird\Firebird_2_5\include и C:\Program Files (x86)\Firebird\Firebird_2_5\lib.
Все буквы назвал - а слово сложить, не ? :)
Неужели так сложно пример на C перевести на Pascal ?
Тем более, что примеров на Pascal - вагон (тот же IBX)
...
Рейтинг: 0 / 0
15.03.2020, 12:47
    #39937547
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
kdv,

я вообще не понимаю что ты считаешь.
Ну рассказывали же уже 100500 раз как хранятся блобы, какие у них есть уровни и т.п.
...
Рейтинг: 0 / 0
15.03.2020, 13:17
    #39937551
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
hvlad,

давай тогда начнем с конца, причем сразу оговорим, что у нас здоровенный блоб, для которого есть страницы уровня 1 и 2. Уровень 2 - это "конечная" страница блоба, где хранятся данные. Так?
Уровень 1 - страница со ссылками на эти самые страницы. На страницу 16к влазит 512 32битных ссылок. Значит, одна страница 1 уровня может адресовать 8 мегабайт блоба (512*16384) на страницах 2 уровня.
Теперь, ссылки в записи на 1 уровень страниц блоба. Вот я не знаю, сколько их может быть. Если 1 страница, то это опять 512 ссылок (максимум), но запись же может быть фрагментирована?
Если только одна страница 16к, значит 512*8мб = 4 гиг. А если 64к фрагментированых на 4 страницы по 16к, тогда уже 16 гиг.

Но это всё равно не стыкуется с "тех данными" которые в доке. Значит, чего-то я не учитываю (или считаю неправильно, что одно и то же).
...
Рейтинг: 0 / 0
15.03.2020, 13:55
    #39937562
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
kdv
Уровень 2 - это "конечная" страница блоба, где хранятся данные. Так?
Нет
kdv
На страницу 16к влазит 512 32битных ссылок
Нет

Любой блоб любого уровня начинается с записи о блобе. Запись таблицы содержит номер эаписи о блобе (blob_id) - он 8-ми битный.
В этой записи о блобе находится его заголовок, длина, кол-во сегментов и прочая мета инф-ция,
а также данные блоба.
Для блоба 0 уровня все его данные находятся в записи о блобе.
Для блоба 1 уровня в записи о блобе находится массив номеров страниц в которых находятся данные блоба.
Для блоба 2 уровня в записи о блобе находится массив номеров страниц в которых находится массив номеров страниц в которых находятся данные блоба.
По аналогии можно придумать и 3-ий уровень и т.д., но это не нужно на практике.

Дальше сам посчитаешь ?

PS Напомню, что 16КБ содержит 4096 4-х байтных (32-битных) эл-тов, никак не 512
...
Рейтинг: 0 / 0
15.03.2020, 14:09
    #39937568
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
Ну, кто-нибудь скажет, каков максимальный размер блоба на самом деле?

Не в ODS, а доступный через кондовые библиотеки доступа.

А потом мы на это сообщение ссылаться будем, раз в документации до сих пор противоречия.
...
Рейтинг: 0 / 0
15.03.2020, 14:28
    #39937574
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
ъъъъъдоступный через кондовые библиотеки доступа.

А это, видишь ли, зависит от степени кривизны рук кондового автора конкретной библиотеки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2020, 14:29
    #39937575
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaos
Vlad F,

Ответил в исходной теме. Результаты интересные, похоже использование ISC API напрямую мне не поможет.

Понятно. Древние разработчики в таких случаях говорили, - Видит око, да зуб не ймёт.))
P.S. А приведи здесь полностью тот метод FireDAC из первого поста, в котором поднимается AV при вызове API. Не исключено, что его помогут подправить в нужном направлении ("чтения до упора")) раз уж тяжёлая артиллерия подключилась.))
...
Рейтинг: 0 / 0
15.03.2020, 14:30
    #39937578
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
hvladДля блоба 2 уровня в записи о блобе находится массив номеров страниц
я думал что 2 - это конечная страница данных блоба.
hvladНапомню, что 16КБ содержит 4096 4-х байтных
тьфу, блин, я байты на биты делил... :-)

Так-то да, получается для страницы 4к = 1024*1024*4096 = 4 гиг. А для страницы 16к - 274 гиг. Для 8к - 34 гиг.
...
Рейтинг: 0 / 0
15.03.2020, 14:44
    #39937588
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
Vlad F,

function TIBBlob.Read (FireDAC.Phys.IBWrapper.pas)
Код: pascal
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.
42.
43.
44.
45.
function TIBBlob.Read(ABuff: PByte; ABuffLen: LongWord): LongWord;

{$IFDEF FireDAC_MONITOR}
  procedure Trace1;
  begin
    Env.Trace(sisc_get_segment, ['blob_handle', FBLHandle]);
  end;
{$ENDIF}

var
  iStatus: ISC_STATUS;
  iSeg, iRead: Word;
  pOrigBuff: Pointer;
begin
  ASSERT(IsOpen);
  Result := 0;
  pOrigBuff := ABuff;

  if National and (ABuffLen > 0) then
    ABuff := FDatabase.Buffer.Check(ABuffLen * SizeOf(WideChar));

  while ABuffLen > 0 do begin
    if ABuffLen > High(Word) then
      iSeg := High(Word)
    else
      iSeg := Word(ABuffLen);
{$IFDEF FireDAC_MONITOR}
    if Env.Tracing then Trace1;
{$ENDIF}
    iStatus := Lib.Fisc_get_segment(@Error.FStatusVector, @FBLHandle, iRead,
      iSeg, PISC_SCHAR(ABuff));
    if (iStatus <> 0) and (Error.FStatusVector[1] <> isc_segment) and
       (Error.FStatusVector[1] <> isc_segstr_eof) then
      Check(iStatus);
    ABuffLen := ABuffLen - iRead;
    ABuff := ABuff + iRead;
    Result := Result + iRead;
    if Error.FStatusVector[1] = isc_segstr_eof then
      Break;
  end;

  if National and (Result > 0) then
    Result := FDatabase.Encoder.Decode(FDatabase.Buffer.Ptr, Result,
      pOrigBuff, ecUTF16);
end;




AV на Lib.Fisc_get_segment.
...
Рейтинг: 0 / 0
15.03.2020, 15:27
    #39937598
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
nicholaosAV на Lib.Fisc_get_segment.

Такое может быть только если вызывающий код скармливает кривой указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2020, 15:48
    #39937600
nicholaos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Техническая спецификация на официальном сайте и максимальный размер BLOB'а
Dimitry Sibiryakov,

Вызывающий код (из основной темы )

BLOBToFile
Код: pascal
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.
procedure TForm1.btBLOBToFileClick(Sender: TObject);
var
  s: TStream;
  fs: TFileStream;
begin
  FDConnection1.Connected := True;
  FDTransaction1.StartTransaction;

  FDQuery1.FetchOptions.AutoFetchAll := afDisable;
  FDQuery1.FetchOptions.Cache := [fiDetails, fiMeta];
  FDQuery1.FetchOptions.Items := [fiDetails, fiMeta];

  FDQuery1.SQL.Text := 'select ID, FILE_ from TEST_BLOB where ID = :ID';
  FDQuery1.MasterFields := 'ID';
  FDQuery1.ParamByName('ID').AsInteger := 1;
  FDQuery1.Open;
  if not FDQuery1.Eof then begin
    fs := TFileStream.Create('C:\Work\disk2.iso', fmCreate);
    try
      s := FDQuery1.CreateBlobStream(FDQuery1.FieldByName('FILE_'), bmRead);
      fs.CopyFrom(s, -1);
    finally
      fs.Free;
    end;
  end;
  FDQuery1.CloseStreams;
  FDQuery1.Close;

  FDTransaction1.Commit;
  FDConnection1.Connected := False;
end;




Падает на CreateBlobStream, только для больших файлов (>2ГБ).
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Техническая спецификация на официальном сайте и максимальный размер BLOB'а / 25 сообщений из 48, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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