SASGIS

Веб-картография и навигация


View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0003173SAS.ПланетаРефакторингpublic03-02-2017 13:1827-03-2019 07:37
ReporterRobbi 
Assigned To 
PrioritylowSeveritytweakReproducibilityalways
StatusconfirmedResolutionopen 
PlatformOSOS Version
Product Version160707 
Target Version30xxxx.VipFixed in Version 
Summary0003173: База меток в MongoDB: Медленный импорт файлов
DescriptionИсходные данные:
1) БД Монго в которой >300k Меток рассортированных по категориям
2) Kml файл объемом около 100Мб содержащий >100к меток с описаниями

При импорте консоль монго отображает медленные запросы. Как я понимаю, при вставке каждой метки происходит вычисление id с помощью аггрегирующего запроса и затрачивается 180-190мс на каждый запрос.
Если я прав, то предлагаю сделать следующее:
1) при импорте блокировать таблицу на запись
2) вычислять максимальный существующий id
3) вставлять все метки последовательно увеличивая id не выполняя запросов к бд для вычисления следующего id
4) разблокировать таблицу
Tagsmongo, импорт, метки
Attached Files

- Relationships

-  Notes
(0017796)
vdemidov (manager)
03-02-2017 13:32

Ну, вам скорее всего сюда https://synopse.info/forum/viewforum.php?id=2
Мы пользуемся ORM для унификации доступа к разным базам, а как вставлять метки и вычислять id решает уже либа.
(0017797)
Robbi (developer)
03-02-2017 15:16

Я давно не слежу за исходниками программы, потому и не могу сразу определить к кому именно это, разработчикам виднее. Но насколько я понимаю разбор kml происходит именно в Планете. Библиотека не предоставляет batch режим для вставки однотипных объектов?
(0017798)
Robbi (developer)
03-02-2017 15:18

https://synopse.info/forum/viewtopic.php?id=3781
Это не относится, случайно, к теме?
(0017800)
zed (manager)
03-02-2017 18:11

В mORMot есть возможность указать, как конкретно вычислять id для MongoDB, более того, по умолчанию там id всегда запоминался при первом обращении и только по моей просьбе была добавлена опция, чтобы id вычислялся каждый раз.

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

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

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

VStorage.EngineAddCompute := eacMaxIDEachTime;

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

Попробуйте, сравните быстродействие. Только не пытайтесь модифицировать метки сразу из двух копий SAS.
(0017801)
Robbi (developer)
03-02-2017 18:27

Так если будет возможность заблокировать таблицу на запись, то совместная работа не пострадает. Главное id вычислять один раз перед любой вставкой набора данных.
За версию спасибо, попробую.
(0017802)
zed (manager)
03-02-2017 18:40

Это надо много писать MongoDB-специфичного кода, либо вообще выносить его в отдельный тип меток и применять там всю оптимизацию, какую только можно.

Дело в том, что когда я писал новые метки, основной упор был на SQLite3, а поддержка MongoDB и СУБД появилась чисто случайно, из-за того, что фреймворк позволял их прикрутить весьма просто. Но вот сделать однотипный код, который бы одинаково эффективно работал со всеми этими БД, довольно трудоёмко и я пока не готов этим заниматься. Если вас этот момент интересует, можете заняться реализацией.
(0017803)
Robbi (developer)
03-02-2017 18:47

Удаление дерева меток также происходит мучительно долго... Получается что сложные операции импорта большого объема данных и удаления лучше производить с помощью небольших программ для этого написанных, а не с помощью Планеты.
Написанная на Java программа выполняет удаление дерева меток (с блокировкой таблицы) за несколько секунд, Планета - около десяти минут удаляла и в конце выдала ошибку "EAssertionFailed: Assertion failure (D...u_MarkDBImplORMHelper.pas, line 1350)".
Импорт происходит теперь адекватно быстро.
(0017804)
Robbi (developer)
03-02-2017 18:53

Так по идее блокировка таблицы на запись должна быть универсальной для всех БД, внутри используемой библиотеки уже различаясь реализацией для SQLite, Mongo, ...
Генерация ID также реализована для всех, надо лишь немного изменить логику работы. Я бы занялся реализацией, но в Delphi я пока могу лишь собрать приложение из исходников ну и что-то совсем простое поправить.
(0017805)
Robbi (developer)
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 (manager)
03-02-2017 18:58

Заведите отдельный тикет. Не надо лепить все проблемы в одну кучу. И убедитесь, что баг относится к ночнушке, а не к тестовой сборке, что я вам дал.
(0017807)
Robbi (developer)
03-02-2017 19:13

В ночнушке также падает. Но не при удалении обнаруживалось, а рандомно, если приложение некоторое время простаивало (около часа)
Тикет создам

- Users who viewed this issue
User List Anonymous (2738x), SilentJim (1x), vdemidov (16x), ygorigor (2x), VMatveev (2x), zed (11x), alexandr-dolgov (1x), Robbi (19x), Garl (1x)
Total Views 2791
Last View 01-11-2024 00:04

- Issue History
Date Modified Username Field Change
03-02-2017 13:18 Robbi New Issue
03-02-2017 13:19 Robbi Description Updated View Revisions
03-02-2017 13:32 vdemidov Note Added: 0017796
03-02-2017 15:16 Robbi Note Added: 0017797
03-02-2017 15:18 Robbi Note Added: 0017798
03-02-2017 18:11 zed Note Added: 0017800
03-02-2017 18:27 Robbi Note Added: 0017801
03-02-2017 18:40 zed Note Added: 0017802
03-02-2017 18:47 Robbi Note Added: 0017803
03-02-2017 18:53 Robbi Note Added: 0017804
03-02-2017 18:56 Robbi Note Added: 0017805
03-02-2017 18:58 zed Note Added: 0017806
03-02-2017 19:13 Robbi Note Added: 0017807
24-04-2017 15:24 vdemidov Tag Attached: mongo
24-04-2017 15:24 vdemidov Tag Attached: импорт
24-04-2017 15:24 vdemidov Tag Attached: метки
24-04-2017 15:33 vdemidov Summary Медленный импорт файлов => База меток в Mongo. Медленный импорт файлов
26-04-2017 08:26 zed Product Version .Nightly => 160707
26-04-2017 08:26 zed Summary База меток в Mongo. Медленный импорт файлов => База меток в MongoDB: Медленный импорт файлов
27-03-2019 07:37 vdemidov Priority normal => low
27-03-2019 07:37 vdemidov Status new => confirmed
27-03-2019 07:37 vdemidov Target Version => 30xxxx.Vip



Copyright © 2007 - 2024 SAS.Planet Team