|
fias house
|
|||
---|---|---|---|
#18+
Господа, Вопрос на фантазию: Стоит задача максимально быстро затянуть в базу сиквела полную базу фиас по домам. В этом плане кто как бы выстроил процесс? Поясню в чем интерес и что следует учесть: база данных домов представленна кучей файлов .dbf вида :HOUSE01.dbf, HOUSE02.dbf, HOUSENN.dbf Сейчас NN ограниченна размером в 99, но будем учитывать что в итоге порог файлов может перешагнуть эту отметку и потенциально файлов будет больше 100. нужно выстроить некий ETL процесс таким образом что бы он мог жить максимально долго без каких либо видоизменений в будующем. в связи с этим вопрос рисования dtsx-пакета достаточно не тривиальный. есть несколько идей как грузить: как мне видится максимально быстро было бы загрузить каждую dbf в отдельную таблицу в параллельных потоках по типу: нарисовать глобальный скоуп задач DF покрывающий каждый потенциальный файл после этого сделать merge всего этого добра в единую таблицу. но этот подход не попадает в рамки условия что в будующей добавятся новые файлы, нужно будет добавлять дополнительные задачи data flow для новых файлов. но тут есть потенциальный минус: в одной DF указывать кучу избыточных источников к примеру перечислить 100 источников каждый на свою dbf, то при запуске когда пакет попытается обратиться к источнику данных и не найдет его, он остановит весь шаг dataflow, а загрузки желательно должны быть не зависимы друг от друга: то есть если к примеру HOUSE05.dbf не положили - ничего страшного загрузится все без нее. (и кстати у меня пакет при использовании овер 70 источников данных валится с ошибкой доступа oledb, не стал разбираться с чем это связанно) другая идея что в начале отрабатывает скриптовая задача которая собирает список доступных файлов в каталоге загрузки и в рантайме мастерит новый пакет с требуемым кол-вом DF задач (не проверял, потенциально возможно, но не уверен что будет работать) можно конечно выстроить модель: foreach var_dbf in catalog { run dataflow => oledb.AccessMode = Openrowset from variable, oledb.OpenrowsetVariable = var_dbf } но такой подход будет файлы грузить последовательно а не параллельно. вообщем кто как бы выстроил модель загрузки данных? подчеркиваю цель - максимально быстрая загрузка с минимальными возможными изменениями процесса если кол-во файлов данных со временем будет меняться, спортивный интерес. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2020, 19:40 |
|
fias house
|
|||
---|---|---|---|
#18+
кстати еще пришла мысль в голову что динамически можно выстроить в таком ключе: в одном пакете собрать список файлов в папке и в for each цикле по данному списку запускать параметризированный пакет вида псевдокод Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
где var_sourcefile = будет первым параметром пакета var_destination_table = вторым параметром пакета главное что бы запуск задачи execute package task был асинхронен, не помню есть ли опция у данного таска не ждать завершения работы пакета. опять правда что то придется придумывать с синхронизацией загруженных данных в общую кучу когда все таски отработают ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2020, 21:14 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff, у меня это сделано через промежуточные таблицы, в которые сначала загружаются все DBF, затем производится синхронизация с внутренним справочником. Но задача максимально быстро не стоит. ФИАС настолько часто не обновляется. От идеи загрузки домов отказались, т.к. актуальность запаздывает, это не устраивает. Кроме того ,есть проблемы с учетом угловых домов. Одновременно можно загружать в кластерную секционированную таблицу если очень хочется. Но это не новость, полагаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 01:20 |
|
fias house
|
|||
---|---|---|---|
#18+
Делал я как-то загрузчик на С# для подобной задачи. Выделяется сразу пул потоков, по мере их освобождения подкидывается задача через лямбда-выражение. Уже не помню всех материй. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 01:27 |
|
fias house
|
|||
---|---|---|---|
#18+
Владислав Колосов felix_ff, у меня это сделано через промежуточные таблицы, в которые сначала загружаются все DBF, затем производится синхронизация с внутренним справочником. Но задача максимально быстро не стоит. ФИАС настолько часто не обновляется. От идеи загрузки домов отказались, т.к. актуальность запаздывает, это не устраивает. Кроме того ,есть проблемы с учетом угловых домов. Одновременно можно загружать в кластерную секционированную таблицу если очень хочется. Но это не новость, полагаю. да в целом у меня тоже острой задачи не стоит. у нас есть обычный пакет по последовательной загрузке он вообще полный справочник лопатит где то минут за 30-40 на виртуалке с 16 гб озу, но чет на меня сегодня перфекционизм напал решил поизвращаться поэкспериментировать в плане фантазии высокого полета как можно было бы добиться более внушительных показателей. и пока копался как раз наткнулся на некоторые костыли в плане возможных извращений как раз источников данных по провайдеру jet.oledb - они нормально не параметризируются из-за этого сделать более менее адаптивный пакет к динамическому содержимому -приходится придумывать какие то мудреные схемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 01:47 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff, я размышлял, но простого для понимания решения для SSIS не нашел. Источник можно определить через переменную, например, но как организовать параллелизм не совсем понятно. На C# реализовать параллельную загрузку файлов проще, припоминаю,что я делал расчет номеров пула потоков исходя из количества ядер. Можно зарезервировать сотню секций, например и при передаче потока передавать номер секции во вставляемых данных согласно номеру потока в пуле. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 01:57 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff Господа, Стоит задача максимально быстро затянуть в базу сиквела полную базу фиас по домам. В этом плане кто как бы выстроил процесс? Сошлюсь на свою статью: https://habr.com/ru/post/451720/ Правда, грузит медленно. 5 часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 07:40 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff подчеркиваю цель - максимально быстрая загрузка с минимальными возможными изменениями процесса если кол-во файлов данных со временем будет меняться, спортивный интерес. В начале пакета получать список всех файлов, и распределять по этим потокам. Грузить в одну таблицу-кучу. По моему, тривиальное решение, если файлы одинаковые. felix_ff при запуске когда пакет попытается обратиться к источнику данных и не найдет его, он остановит весь шаг dataflow ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 07:51 |
|
fias house
|
|||
---|---|---|---|
#18+
uaggster felix_ff Господа, Стоит задача максимально быстро затянуть в базу сиквела полную базу фиас по домам. В этом плане кто как бы выстроил процесс? Сошлюсь на свою статью: https://habr.com/ru/post/451720/ Правда, грузит медленно. 5 часов. Но почему XMLBulkLoad загружает так медленно??? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 08:08 |
|
fias house
|
|||
---|---|---|---|
#18+
alexeyvg, Таблицы гружу последовательно, можно параллельно, тогда будет 2,5 часа. Дольше всего грузится фиас-хаус, собственно, 2,5 часа. Сервер 24 Гб RAM, зеркало из 7200 шпинделей. Грузится 3-5 Мб/с ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 09:33 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff, А зачем грузить сразу всё? Там же что-то было типа "последние изменения". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 09:57 |
|
fias house
|
|||
---|---|---|---|
#18+
crutchmaster, Код: sql 1.
да, дельту мы и грузим она маленькая, но тут недавно был косяк загрузки при котором дельта накатила дополнительно новые дома не убрав при этом старые. во вторых это спортивный интерес. а в третьих базы выкладываемые через dbf и xml отличаются (проверял еще давно, не знаю сейчас они этот момент поправили или нет, я писал им на техподдержку еще года полтора назад может уже их синхронизировали). Этим же разработчик управляет. Хочет, останавливает пакет при ошибке, хочет, не останавливает. вот чет у меня не получилось не отменять действие шага если внутри datasource вызывает исключение: настройка была такая: псевдокод Код: 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. 38. 39. 40. 41. 42.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 10:58 |
|
fias house
|
|||
---|---|---|---|
#18+
еще кстати для ускорения есть идея грузить в стейджевые in-memory таблицы а уже с них сливать в постоянную дисковую, руки пока не дошли до конфига самого сервера но там думаю тоже есть с чем поиграться ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 11:02 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff, Да надо тогда уж вообще сделать id-хеш строки и засунуть всё в какую-нибудь key-value-nosql, да проверять изменения по ней. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 12:34 |
|
fias house
|
|||
---|---|---|---|
#18+
felix_ff еще кстати для ускорения есть идея грузить в стейджевые in-memory таблицы а уже с них сливать в постоянную дисковую, руки пока не дошли до конфига самого сервера но там думаю тоже есть с чем поиграться Не надо, я такое тестировал для DWH, выигрыша особо и нет. alexeyvg предложил способ распараллеливания, им и пользуйтесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 15:04 |
|
fias house
|
|||
---|---|---|---|
#18+
uaggster alexeyvg, Таблицы гружу последовательно, можно параллельно, тогда будет 2,5 часа. Дольше всего грузится фиас-хаус, собственно, 2,5 часа. Сервер 24 Гб RAM, зеркало из 7200 шпинделей. Грузится 3-5 Мб/с Может, возрастёт скорость в десяточек раз, если это перевыключить? Притом что вы грузите в кучи без индексов, и, как я понял, без других констрейнов, решив всё это создать потом. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2020, 20:11 |
|
|
start [/forum/topic.php?fid=46&fpage=50&tid=1685744]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 385ms |
0 / 0 |