|
|
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Delphi Rio 10.3.3 Firebird 2.5.9, 32-х битный Тестовая БД (page_size = 16384) с одной таблицей с одной записью с очень большим (не текстовым) BLOB'ом. Размер исходного файла на диске - 7.57 GB (8,132,685,824 bytes) Размер файла БД на диске - 7.73 GB (8,307,064,832 bytes) DDL Код: plsql 1. 2. 3. 4. 5. 6. isql показывает размер файла некорректно: Код: plsql 1. 2. 3. 4. 5. Хотя по спецификации ( https://firebirdsql.org/en/firebird-technical-specifications ) поддерживаются BLOB'ы до 32 ГБ. Загружал в БД следующим кодом: BLOBToDB Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Пытаюсь загрузить из БД: 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. Падает на CreateBlobStream с ошибкой Access Violation. Стэк вызовов приводит к Lib.Fisc_get_segment в TIBBlob.Read (FireDAC.Phys.IBWrapper.pas). Маленькие файлы сохраняются без проблем. Вопрос - есть ли известные способы работы с большими блобами? Другие компоненты доступа, например? IBEScript.dll не справился. Известная UDF BlobSaveLoad справляется, но работает только на сервере. Придется писать самому на ISC API? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 18:04 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 18:16 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev, Читал. С загрузкой в БД проблем нет, я писал. Проблема с загрузкой из БД и только на больших файлах - похоже на ошибку или ограничение самого FireDAC. В документации для select'а вместо вменяемого примера только SQL Server FILESTREAM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 18:22 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
А попробуйте написать хранимку, которая получает ID строки в таблице TEST_BLOB, считывает блоб в переменную, разбивает на куски и возвращает блоб кусками. Клиент используя процедурку прочитает блоб кусками и соединит их уже средствами Delphi. Так Вы сможете помимо прочего показывать прогресс считывания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 19:43 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Sinemurius, У меня не текстовый блоб размером 7 ГБ. Если разбить его на куски в хранимке вообще технически возможно, то навряд ли это правильное решение. Коллбэк для прогресс-бара, по-хорошему, должен вызывать сам стрим в момент считывания очередного куска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 19:59 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos, Максимальный размер поля BLOB ограничен 4 ГБ. Для размера страницы 4 КБ (4096 байт) максимальный размер меньше - чуть меньше 2 ГБ. https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-datatypes-bnrytypes.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 20:08 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos Хотя по спецификации ( https://firebirdsql.org/en/firebird-technical-specifications) поддерживаются BLOB'ы до 32 ГБ. Смотри официальную документацию, а не фик знает что. Вот тут руководство по 2.5 скачать можно: https://www.sql.ru/forum/1123374/ann-rukovodstvo-po-yazyku-sql-subd-firebird-2-5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 20:29 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos Sinemurius, У меня не текстовый блоб размером 7 ГБ. Если разбить его на куски в хранимке вообще технически возможно, то навряд ли это правильное решение. Коллбэк для прогресс-бара, по-хорошему, должен вызывать сам стрим в момент считывания очередного куска. Бинарный блоб спокойно режится substring-ом. Примерно так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Где выходные параметры хранимки - BlobNumPart (номер куска) и BlobPart (кусок блоба) Вы можете не скачивать весь файл, а скачивать кусками для использования. К примеру, если это видео, то скачиваете кусками и подкидываете куски плееру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 20:53 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Можете повозиться и написать свой потомок от TStream, который будет обращаться к базе и вытаскивать блоб кусками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 21:08 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, Загрузил файл размером 2.78 GB - аналогичная ошибка. Sinemurius, Попробую в порядке эксперимента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 21:39 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos, Продублируй вопрос в форме по IB/FB. Там хватает высоких ценителей егойного API, если у FireDAC-а в данном месте возможные проблемы с его использованием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 22:05 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Vlad F, Дублировать 1-в-1 не стал, но ссылку сюда написал , если вдруг кто-то читает форум Firebird и не заходит в раздел Delphi. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 22:29 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos, Вижу. Однако ты тему совсем неудачную там задал, малоинформативную и непривлекательную и не по существу, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2020, 22:39 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Sinemurius, В хранимке разрезать блоб не получилось, все функции, возвращающие длину, работают некорректно. Проверял так: DDL Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Результат выполнения: Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 11:57 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Vlad F, Проверил IBX: BLOBToFileIBX Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Падает с Range Check Error на fs.CopyFrom. Отладчик приводит к GetBlobInfo (IBX.IBBlob.pas). Функция isc_portable_integer возвращает для TotalSize некорректное значение (см. картинку). Похоже все упирается в ISC API у которого аналогичные octet_length'у проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 12:08 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos, А length ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 12:21 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Sinemurius, Нет такого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 12:24 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Что-то смахивает на то, что блоб загружен в базу как то криво. Вообще хранить 7 гигабайтные блобы - это как то неэлегантно что-ли. Вы уверены, что Вам именно это нужно ? Я бы рассмотрел вопрос о том, чтобы хранить не в базе, а в файловой системе. Ну или разбивать блоб на куски в момент загрузки блоба в базе. Ну к примеру сделать связанную с Вашим TEST_BLOB табличку для хранения кусков блоба. Ну и рассмотреть: что у Вас за блоб такой ? что в нем хранится ? можно ли это разбить на какие то структурированные куски ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 13:50 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Sinemurius, Не элегантно, согласен. Для прикладной задачи мне достаточно и 2-х ГБ. Но даже попытка скачать 2 ГБ падает с ООМ на CreateBlobStream, что в FireDAC, что в IBX. С бóльшим размером блоба задача носит больше академический характер - обратить внимание разработчиков на неоднозначность документации, зафиксировать баги компонентов доступа, ISC API, функции octet_length. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 14:12 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaosНо даже попытка скачать 2 ГБ падает с ООМ на CreateBlobStream, что в FireDAC, что в IBX. Потому что автор IBX был рукожоп, а FireDAC унаследовал архитектуру. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 14:29 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Мне удалось скачать блоб 7.5 GB с помощью вызова ISC API напрямую. Полный текст программы, C++ Код: 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. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. Контрольные суммы исходного файла и скаченного совпали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 17:56 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaosПолный текст программы, C++ Полагаешь, так много людей неспособны найти у Firebird каталог examples\api, что нужно его здесь цитировать?.. Ну, наверное, ты прав. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 18:09 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos, Теперь нужен патч для FireDAC. Сделаешь очень доброе дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 18:44 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
Vlad F, Патч - это когда можно обойтись простым фиксом. Тут нужен полноценный пул-реквест. Во-первых, нужно отовсюду удалять использование TIBBlob.total_length - он возвращает неправильное значение. Во-вторых, нужно в CreateBlobStream научится не аллоцировать память полностью и работать аналогично файловому стриму - читать данные по мере их запрашивания в методе CopyFrom. Все это нужно и для IBX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 20:33 |
|
||
|
FireDAC и очень большой BLOB (Firebird) - AV при попытке скачать
|
|||
|---|---|---|---|
|
#18+
nicholaos, Да хрен бы с этим IBX (хотя я сам до сих пор на нем плотно сижу), - надо думать на перспективу. Сделай тикет на QC хотя бы для FireDAC, с указанием путей решения проблемы в целом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2020, 20:41 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39937650&tid=2038487]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 347ms |

| 0 / 0 |
