-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ljoin] $lookup не задействует индекс при работе с интервалами #7
Comments
Если кто мыслит на SQL, пишите на SQL, я не растеряюсь. Придумаете что-нибудь под любую привычную вам СУБД - будет не менее полезно. |
Привет! |
Сорри, я не вполне разобрался в синтаксисе, но мне кажется, что у тебя операция min/max вынуждена пересчитывать границу для каждого объекта. |
Илья, Юстина, спасибо! Если применить конструкцию from-let-pipeline-as не к chrom-start-end, а к какому-нибудь одному полю (например, name для тех же BED), то команда выполнится моментально.
Это говорит о том, что само наличие pipeline, вложенного в $lookup, не виновато. Значит, тормозит либо упомянутая Ильёй операция min/max, либо обработка сразу по хромосомам и позициям. |
Создан, в первую очередь, чтобы получить схожие по структуре и гарантированно содержащие пересекающиеся интервалы BED-файлы для диагностики #7. Естественно, эта прога потом пригодится для создания тестировочных файлов под многие другие задачи.
Избавился от $max и $min.
Та же хрень. |
Не знаю...
Во-вторых, посмотри, работает ли отдельно условие на хромосому и отдельно на одну из позиций - так же как ты отдельно проверял условие на имя. |
После упразднения вложенного $and ничего не изменилось. Отдельные условия. Оказывается, всё зависит от оператора. |
Очень интересно. Попробуй пару вещей:
|
Проверил - не влияет.
Тоже не работает.
Запросы без агрегации точно индексы используют. И сортировка тоже (там, правда, свои тараканы - #5). |
- Уменьшил вложенность в пайплайне объединения интервалов. Issue #7 это, к сожалению, не решает. Новый код пусть будет отправной точкой для дальнейшего исследования проблемы.
- VCF: пересечение/вычитание по хромосоме и позиции. Кстати, омерзительный баг #7 в этом случае не наблюдается. Он только работу с интервалами затрагивает. - Поддержка квазизначения глубины - 0, интерпретируемого как равенство количеству правых коллекций. - Принт с окончательным значением глубины. - Улучшение справки.
- Смелый эксперимент с пересечением по локации. К сожалению, скорость сильно зависит от сочетания форматов, а также от размера исходной таблицы и коллекции. Проблема напоминает пресловутый баг #7, но при интервальном пересечении прогой annotate точно задействуется составной индекс (#CHROM_1_POS_1 или chrom_1_start_1_end_1). - Протащил сюда все новшества query 3.х, в частности, projection. - Конечные метастроки теперь более VCF-way. - Принты на англоязе как первый шаг подготовки к статье.
- Left join по локации как отдельная опция с предупреждением об её экспериментальном (см. #7) статусе. - Опция отбора полей (projection). - Огромный рефакторинг. - Переработанный генератор конечных метастрок. - По-новому строятся имена output-файлов. - Замер времени выполнения основного кода. - Ещё более подробная теория левых и правых коллекций в приветственном принте. - Глубина теперь - не глубина, а охват. - Если в БД меньше 2 коллекций - программа упадёт не через sys.exit(), а более цивилизованно - путём вызова исключения. - Принты на английском.
Вчера, по-сути, завершил проект high-perf-bio, реализовав в left_join отбор геномных интервалов одной MongoDB-коллекции по их вхождению/невхождению в интервалы из других коллекций БД. Но, как выяснилось, не без ложки дёгтя.
Пояснение для IT-специалистов, не специализирующихся на работе с генетическими данными. Что такое геномный интервал? Есть хромосомы - надмолекулярные сткуктуры, включающие, помимо всего прочего, ДНК. Есть нуклеотиды - мономеры ДНК. Сослаться на тот или иной участок ДНК можно так: обозначение хромосомы, номер стартового нуклеотида, номер конечного нуклеотида. Эти два нуклеотида - границы как раз геномного интервала. В биоинформатических таблицах чаще всего мы видим интервалы с выявленным влиянием на организм.
Aggregation pipeline из программы left_join, построенный по официальным докам MongoDB, выдаёт правильные результаты, но работает бесконечно долго для больших коллекций. Ни compound, ни одиночные индексы не ускоряют вычисление. Вот основа пайплайна - код левостороннего внешнего объединения коллекций - источника описываемой проблемы:
Эта же конструкция, но чуть упрощённая (Ilya Vorontsov):
Каждый объединённый документ представляет собой документ "левой" коллекции, в который вложены отвечающие запросу документы "правых" коллекций. Если в "правой" коллекции не нашлось соответствий, в объединённый документ попадает пустой список.
Кто-нибудь знает, как решить/обойти проблему игнора индексов?
P.S. Я уже создал аналогичную тему на официальном форуме MongoDB, но там далеко не всегда отвечают. Поэтому очень надеюсь на помощь коллег, знакомых и других посетителей репозитория.
@VorontsovIE, @yustinaivanova, может у вас будут какие-то идеи? Был бы очень благодарен.
Предполагаемые тормозящие факторы:
$lookup
-пайплайну сортировка. Сразу говорю, что она не влияет.The text was updated successfully, but these errors were encountered: