|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
В процедуру загружаю (через BLOB) достаточно большой текст (XML). в процедуре произвожу "резку" текста по тегам, с последующей вставкой фрагментов в таблицу. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
столкнулся с тем, что небольшие файлы (1-2 мб, 1000 - 1500 блоков) обрабатываются достаточно быстро 2-3 секунды, однако при размере файлов в 35 мб 19200 блоков процедура просаживается в производительности без вставки, а только на цикл WHILE ... затрачивается более 40 минут. FB 2.59, WIN 2003, сервер виртуальный, 4 ядра XEON 2.4 , памяти 8GB, подключение только моё ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:40 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, временные блобы перестают помещаться в страничном кеше и начинают сбрасываться на диск ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:50 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, В чём смысл делать всё это именно на стороне FB? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:52 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис zeon11, временные блобы перестают помещаться в страничном кеше и начинают сбрасываться на диск Ок, понятно. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:54 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
crutchmaster zeon11, В чём смысл делать всё это именно на стороне FB? Если это можно делать на сервере, зачем это делать ещё где-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 09:57 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис zeon11, временные блобы перестают помещаться в страничном кеше и начинают сбрасываться на диск Если так, то попробовать увеличить кеш, пока writes не придут в норму. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:05 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:09 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис zeon11, потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков Да, наверное, придётся так и делать. Раньше с малыми файлами разбирал XML исключительно на сервере. XML разбирался на полтора десятка таблиц, и разбирать на сервере было удобно, всё под рукой, но сейчас появились файлы до 90 мб, и всё резко просело по скорости. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:23 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
hvlad Это легко проверить - смотреть на рантайм статистику выполнения запроса (writes). Если так, то попробовать увеличить кеш, пока writes не придут в норму. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:29 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков Да, и нагрузка уйдёт туда же. У сервера ресурсы не резиновые. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 10:56 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
А через udf не вариант? Либо отдельной службой ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 15:30 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2А через udf не вариант? нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 15:36 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
crutchmaster Симонов Денис потому что на клиенте будет быстрее, распарсить XML, подготовить запрос и сделать инсерт получившихся кусков Да, и нагрузка уйдёт туда же. У сервера ресурсы не резиновые. Сервер на то и есть, чтобы нагрузку держать, тем более, такая работа планируется на ночь, когда он (сервер) пальцем в носу ковыряет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 18:29 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2 А через udf не вариант? Либо отдельной службой Симонов Денис Василий 2А через udf не вариант? нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 UDF тут тоже работает, через UDF'ку разбираю элементарные блоки по значениям и разгоняю их по таблицам. В UDF'ку для ускорения загоняю сразу список значений, что мне надо получить, соответственно из UDF'ки единоразово получаю список результатов. Так что какой-то эрзац-набор данных в процедуре, всё-таки получаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 18:55 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, по идее, из-за офигенного количества временных блобов будет пухнуть база (потом пустое место будет переиспользоваться). http://www.ibase.ru/dbgrowth/ а значит, чем быстрее диск, тем будет быстрее обработка. Обычно на виртуалках проблемы в основном с производительностю диска, кстати. На скорости проца и памяти падает, якобы, не более 5%. А вот на диске может быть много хуже. Я бы проверил диск crystaldiskmark. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 19:02 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
kdv zeon11, по идее, из-за офигенного количества временных блобов будет пухнуть база (потом пустое место будет переиспользоваться). http://www.ibase.ru/dbgrowth/ а значит, чем быстрее диск, тем будет быстрее обработка. Обычно на виртуалках проблемы в основном с производительностю диска, кстати. На скорости проца и памяти падает, якобы, не более 5%. А вот на диске может быть много хуже. Я бы проверил диск crystaldiskmark. Да, статью эту читал, да и постоянно Ваш сайт пересматриваю. Спасибо за ресурс. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 19:14 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 Так и не обязательно, можно и имеющимися средствами извратиться. Например, в цикле вызывать UDF с блобом и позицией, с которой начинать поиск. Пока не вернет пустую строку - повторять в цикле. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 19:35 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2 Симонов Денис нет конечно. UDF умеет возвращать только скалярный результат, т.е. набор данных из неё не вернуть. Выполнять запросы в контексте текущего коннекта и транзакции там тоже нельзя. В UDR (внешние ХП) можно и то и другое, но это в 3.0 Так и не обязательно, можно и имеющимися средствами извратиться. Например, в цикле вызывать UDF с блобом и позицией, с которой начинать поиск. Пока не вернет пустую строку - повторять в цикле. Тогда в UDF надо держать открытым объект, в данном случае TXMLDocument, и гонять его хендл из UDF в процедуру и обратно, и это будет работать скорее всего только на Classic. А может так вообще делать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2020, 21:09 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11 Тогда в UDF надо держать открытым объект, в данном случае TXMLDocument, и гонять его хендл из UDF в процедуру и обратно, и это будет работать скорее всего только на Classic. А может так вообще делать нельзя. Да не, я имел в виду, чтобы udf делала только то, что сейчас делает процедура - извлекала куски из блоба в виде строки varchar. Кстати, насчет размножения временных блобов неплохо бы в доки. А то только в тут https://www.ibase.ru/dbgrowth/ нашел, и то когда давал запрос целенаправленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 10:34 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Василий 2, даже если написать свою версию UDF SUBSTRING которая возвращает VARCHAR(8191), то этот блоб придётся многократно открыть, прочитать и закрыть. Причём если блоб не поточный, то для поиска нужной позиции придётся каждый раз читать его с самого начала. Но это хотя бы уберёт временные блобы. О производительности разных решений. Недавно баловался с написанием внешних процедур на С++ (в качестве самообучения). Написал собственную процедуру split_int для разделения больших BLOB. Суть теста генерируем числа от 1 до 1000000 и соединяем их агрегатной функцией LIST скрипт Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код: 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.
В результате получается блоб размером ~6 Мбайт. Теперь собственно разделение тест split_int Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Код: 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.
1.992 - 0.625 = 1.367 c Т.е. процедура разбила по разделителю 6 мегабайтный блоб за 1.4 секунды. Сильно сомневаюсь что вы сможете получить подобный результат с помощью UDF или PSQL ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:03 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Если не сложно, можешь запустить на этой же конфигурации разделение процедурой PSQL? Чтобы окончательно развеять все сомнения. Напомню процедуру Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:40 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, вечером попробую. Я этот тест на домашней машине делал ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:41 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Если всё с собой - можно на любой повторить :) Главное ведь, чтобы на одной и той же. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 11:46 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, нет у меня на работе UDR той. Я же её писал для развлечения (самообучения), а не для продакшена. Вот на другой машине Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
у меня дома конечно комп чуть по мощней, но не настолько же ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 12:14 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, То есть в 10 раз минимум. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 13:13 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, дома повторю. Если кому-то интересно могу выложить код процедуры на github. Ничего удивительного в этом нет. В моей процедуре BLOB читается однократно (сразу все сегменты) в stream. Дальше я из stream получаю строку, а потом собственно разделяю на подстроки, каждая подстрока возвращается аналогом SUSPEND. Я делал подобную процедуру и на Delphi, но там скорость была почти в 2 раза меньше. Видимо дорого преобразование string <-> ansichar[N] ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 13:27 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис В моей процедуре BLOB читается однократно (сразу все сегменты) в stream. Дальше я из stream получаю строку, а потом собственно разделяю на подстроки, каждая подстрока возвращается аналогом SUSPEND. Не пробовал читать блоб частями ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 13:41 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
hvlad, была мысль обрабатывать обрабатывать частями по 32K. Помимо экономии памяти можно получить профит в виде досрочного прерывания всякими first/rows, так чтобы блоб не читался до конца ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 14:11 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис WildSery, дома повторю. Если кому-то интересно могу выложить код процедуры на github. Было бы интересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 16:24 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, а вот теперь list_to_rows на том же самом компьютере и БД Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 21:33 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Лучше в виде статьи. Пусть даже самой простенькой. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 21:49 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Vlad F, дык писал уже, но не по плюсы https://habr.com/ru/post/455375/ https://github.com/sim1984/udr-book ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 22:10 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Теперь про плюсы. Пора уже их пропагандировать.))) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2020, 23:46 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис ------ Информация о производительности ------ ... Current memory = 280 864 576 Max memory = 281 217 456 Memory buffers = 16 384 Reads from disk to cache = 0 Writes from cache to disk = 1 127 Чтений из кэша = 81 387 Кстати, кто даст внятный, но лаконичный перевод вот этого вот всего на русский, чтобы я забил в локализацию эксперта? Например, Current/max memory - это что и в чем? Reads\writes - это, я так понимаю, в страницах. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2020, 04:36 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
авторКстати, кто даст внятный, но лаконичный перевод вот этого вот всего на русский, чтобы я забил в локализацию эксперта? а оно действительно надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2020, 07:27 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
IBExpertНапример, Current/max memory - это что и в чем? в байтах конечно же. Главное не перевести Current как "текущая", а то стрёмно будет ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2020, 09:19 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис а вот теперь list_to_rows на том же самом компьютере и БД ЗЫ. Надеюсь, это "Fetch All" для обоих замеров? Уточню, на всякий случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2020, 09:57 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
WildSery, я же специально агрегатами min/max обвернул, чтобы там ровно 1 запись возвращалась ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2020, 09:59 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, А. Это я ещё кофе не выпил. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2020, 10:02 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
hvladЭто требует много памяти. Не пробовал читать блоб частями ? попробовал. Очень долго ломал голову, пока не вспомнил, что LIST очень забавно сегментирует блоб. Я то наивно полагал, что прочитаю через getSegment столько байт сколько указываю. Вроде была идея сделать так чтобы LIST возвращал потоковый блоб или передумали? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2020, 18:28 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Симонов Денис, Благодарю. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2020, 21:23 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
Накидал в Lazarus функцию для клиента, может кому пригодится : Код: 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. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62.
Использование функции Код: 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.
файл на 77 мб (42 785 записей) грузится в БД 10 мин Клиентская машина - ноутбук, win 10, памяти 12гб, Core i7 4700HQ, 2.40GHz, про сервер писал выше. Конечно, в процедуре-чоппере есть "вода", можно кое-что и выкинуть, но, думаю, радикально это скорость не повысит. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 11:36 |
|
substring BLOBа медленно
|
|||
---|---|---|---|
#18+
zeon11, поищи готовый SAX parser для XML. Он как раз для случаев когда XML реально большой, чтобы не загружать всё дерево DOM в память. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2020, 11:46 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1560441]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 193ms |
0 / 0 |