SASGIS - SAS.Планета
View Issue Details
0003173SAS.ПланетаРефакторингpublic03-02-2017 13:1827-03-2019 07:37
Robbi 
 
lowtweakalways
confirmedopen 
160707 
30xxxx.Vip 
0003173: База меток в MongoDB: Медленный импорт файлов
Исходные данные:
1) БД Монго в которой >300k Меток рассортированных по категориям
2) Kml файл объемом около 100Мб содержащий >100к меток с описаниями

При импорте консоль монго отображает медленные запросы. Как я понимаю, при вставке каждой метки происходит вычисление id с помощью аггрегирующего запроса и затрачивается 180-190мс на каждый запрос.
Если я прав, то предлагаю сделать следующее:
1) при импорте блокировать таблицу на запись
2) вычислять максимальный существующий id
3) вставлять все метки последовательно увеличивая id не выполняя запросов к бд для вычисления следующего id
4) разблокировать таблицу
mongo, импорт, метки
Issue History
03-02-2017 13:18RobbiNew Issue
03-02-2017 13:19RobbiDescription Updatedbug_revision_view_page.php?rev_id=7128#r7128
03-02-2017 13:32vdemidovNote Added: 0017796
03-02-2017 15:16RobbiNote Added: 0017797
03-02-2017 15:18RobbiNote Added: 0017798
03-02-2017 18:11zedNote Added: 0017800
03-02-2017 18:27RobbiNote Added: 0017801
03-02-2017 18:40zedNote Added: 0017802
03-02-2017 18:47RobbiNote Added: 0017803
03-02-2017 18:53RobbiNote Added: 0017804
03-02-2017 18:56RobbiNote Added: 0017805
03-02-2017 18:58zedNote Added: 0017806
03-02-2017 19:13RobbiNote Added: 0017807
24-04-2017 15:24vdemidovTag Attached: mongo
24-04-2017 15:24vdemidovTag Attached: импорт
24-04-2017 15:24vdemidovTag Attached: метки
24-04-2017 15:33vdemidovSummaryМедленный импорт файлов => База меток в Mongo. Медленный импорт файлов
26-04-2017 08:26zedProduct Version.Nightly => 160707
26-04-2017 08:26zedSummaryБаза меток в Mongo. Медленный импорт файлов => База меток в MongoDB: Медленный импорт файлов
27-03-2019 07:37vdemidovPrioritynormal => low
27-03-2019 07:37vdemidovStatusnew => confirmed
27-03-2019 07:37vdemidovTarget Version => 30xxxx.Vip

Notes
(0017796)
vdemidov   
03-02-2017 13:32   
Ну, вам скорее всего сюда https://synopse.info/forum/viewforum.php?id=2
Мы пользуемся ORM для унификации доступа к разным базам, а как вставлять метки и вычислять id решает уже либа.
(0017797)
Robbi   
03-02-2017 15:16   
Я давно не слежу за исходниками программы, потому и не могу сразу определить к кому именно это, разработчикам виднее. Но насколько я понимаю разбор kml происходит именно в Планете. Библиотека не предоставляет batch режим для вставки однотипных объектов?
(0017798)
Robbi   
03-02-2017 15:18   
https://synopse.info/forum/viewtopic.php?id=3781
Это не относится, случайно, к теме?
(0017800)
zed   
03-02-2017 18:11   
В mORMot есть возможность указать, как конкретно вычислять id для MongoDB, более того, по умолчанию там id всегда запоминался при первом обращении и только по моей просьбе была добавлена опция, чтобы id вычислялся каждый раз.

Дело в том, что фреймворк ориентирован на использование на серверах, в режиме, когда с БД работает только одно приложение эксклюзивно. Есть там и batch режим и он рекомендован к использованию, но опять же, с оглядкой на то, что это дело происходит на сервере, а не как у нас.

Сделал билд, расчитанный на эксклюзивное использование MongoDB: https://yadi.sk/d/AJH45Krl3Chrbf

Всё отличие в одной строке:

VStorage.EngineAddCompute := eacMaxIDEachTime;

которую в этом билде я закомментировал.

Попробуйте, сравните быстродействие. Только не пытайтесь модифицировать метки сразу из двух копий SAS.
(0017801)
Robbi   
03-02-2017 18:27   
Так если будет возможность заблокировать таблицу на запись, то совместная работа не пострадает. Главное id вычислять один раз перед любой вставкой набора данных.
За версию спасибо, попробую.
(0017802)
zed   
03-02-2017 18:40   
Это надо много писать MongoDB-специфичного кода, либо вообще выносить его в отдельный тип меток и применять там всю оптимизацию, какую только можно.

Дело в том, что когда я писал новые метки, основной упор был на SQLite3, а поддержка MongoDB и СУБД появилась чисто случайно, из-за того, что фреймворк позволял их прикрутить весьма просто. Но вот сделать однотипный код, который бы одинаково эффективно работал со всеми этими БД, довольно трудоёмко и я пока не готов этим заниматься. Если вас этот момент интересует, можете заняться реализацией.
(0017803)
Robbi   
03-02-2017 18:47   
Удаление дерева меток также происходит мучительно долго... Получается что сложные операции импорта большого объема данных и удаления лучше производить с помощью небольших программ для этого написанных, а не с помощью Планеты.
Написанная на Java программа выполняет удаление дерева меток (с блокировкой таблицы) за несколько секунд, Планета - около десяти минут удаляла и в конце выдала ошибку "EAssertionFailed: Assertion failure (D...u_MarkDBImplORMHelper.pas, line 1350)".
Импорт происходит теперь адекватно быстро.
(0017804)
Robbi   
03-02-2017 18:53   
Так по идее блокировка таблицы на запись должна быть универсальной для всех БД, внутри используемой библиотеки уже различаясь реализацией для SQLite, Mongo, ...
Генерация ID также реализована для всех, надо лишь немного изменить логику работы. Я бы занялся реализацией, но в Delphi я пока могу лишь собрать приложение из исходников ну и что-то совсем простое поправить.
(0017805)
Robbi   
03-02-2017 18:56   
Второй вариант сообщений о падении при удалении:

EAccessViolation: Access violation at address 00B572D7 in module 'SASPlanet.3173.exe'. Read of address 7FB8D524

EAssertionFailed: Assertion failure (D...u_MarkDBImplORMHelper.pas, line 1350)

EAssertionFailed: Assertion failure (D...u_MarkDBImplORMHelper.pas, line 1350)

Три штуки последовательно. После окончания удаления.
(0017806)
zed   
03-02-2017 18:58   
Заведите отдельный тикет. Не надо лепить все проблемы в одну кучу. И убедитесь, что баг относится к ночнушке, а не к тестовой сборке, что я вам дал.
(0017807)
Robbi   
03-02-2017 19:13   
В ночнушке также падает. Но не при удалении обнаруживалось, а рандомно, если приложение некоторое время простаивало (около часа)
Тикет создам