В настоящее время многие компании сталкиваются с задачами обработки большого количества данных. Данные обрабатываются, перерабатываются и исследуются бизнес-аналитиками, специалистами по машинному обучению, учеными. Однако, если данных оказывается слишком много, при работе с ними могут возникнуть затруднения. В таких случаях может быть полезно профилирование данных — совокупность методов, направленная на извлечение метаданных из набора данных [1] (иначе — получение данных о данных). Благодаря профилированию можно обнаружить различные закономерности, сокрытые в данных, что позволяет сделать некоторые выводы о структуре этих данных и исправить различные ошибки. Существует множество различных методов профилирования, каждый из которых представляет поиск некоторой формально описанной закономерности или правила. Такие закономерности будем называть примитивами. Например, один из самых широко известных примитивов — функциональная зависимость [10]. Примитивы позволяют узнать внутреннюю структуру таблицы, понять, как связаны между собой разные таблицы, они полезны [1] при очистке и интеграции данных, оптимизации и нормализации баз данных. Кроме того, нахождение закономерностей в данных полезно и учёным для анализа результатов экспериментов, специалистам по машинному обучению для выбора параметров моделей, аналитикам для выдвижения гипотез. Один из таких полезных примитивов — зависимости включения. Неформально, между двумя столбцами (возможно из разных) таблиц удерживается зависимость, если множество всех значений одного столбца содержится в множестве всех значений из другого. Такие зависимости применяются в различных алгоритмах работы с базами данных: например, самое часто упоминаемое в литературе применение — поиск первичных ключей [8]. Также зависимости включения используются [12] при оптимизации запросов, проектировании баз данных, интеграции данных.
Для поиска зависимостей включения был разработан ряд алгоритмов, сравнение производительности которых было произведено в статье [12]. Среди этих алгоритмов выделяется Faida — алгоритм приближенного поиска зависимостей включения. В отличие от других алгоритмов, он с небольшой вероятностью может выдавать ложноположительные результаты, однако это позволяет ему работать в несколько раз быстрее точных state-of-the-art алгоритмов. Реализация Faida, а также реализации многих других алгоритмов профилирования были собраны в платформе Metanome — инструменте для профилирования данных, полностью написанном на Java. Инструмент ориентирован на работу с данными и позволяет запускать различные алгоритмы профилирования на входных наборах данных. Однако исследования [5] показали, что производительности реализаций на Java не всегда достаточно для требовательных к ресурсам вычислений на больших объемах данных. Кроме того, перед началом использования Metanome необходимо правильно сконфигурировать и развернуть на машине пользователя, что может быть затруднительно для аналитиков, которые не так тесно связаны с миром разработки.
Чтобы избавиться от описанных недостатков, была разработана платформа Desbordante — инструмент для профилирования данных с открытым исходным кодом, идейный наследник Metanome, написанный на языке C++. Инструмент поддерживает несколько примитивов, в том числе и функциональные зависимости, однако на момент начала настоящей работы поддержка зависимостей включения отсутствовала. Таким образом, было принято решение реализовать алгоритм приближенного поиска зависимостей включения Faida на языке C++, и внедрить код алгоритма в инструмент. Благодаря этому будет создана производительная open-source реализация этого алгоритма.
В ходе работы над созданием высокопроизводительной реализации алгоритма Faida в рамках профайлера данных Desbordante были выполнены следующие задачи:
• произведён краткий обзор предметной области зависимостей включения и алгоритма Faida, выделены три основные стадии работы алгоритма: препроцессинг, генерация кандидатов и валидация;
• алгоритм реализован на языке C++, в качестве эталонной реализации была взята Java-реализация алгоритма из Metanome;
• исследована производительность кода и реализованы оптимизации:
• сторонняя хеш-таблица,
• буферизация,
• векторизация с использованием SIMD-инструкций,
• распараллеливание;
• проведено сравнение производительности С++-реализации с существующей Java-реализацией алгоритма из Metanome. Эксперименты показали, что все предложенные оптимизации улучшают производительность, и оптимизированная C++-реализация работает в среднем в 3.7 раз быстрее Java-реализации.
На основе результатов работы была подготовлена статья [9], которая была принята на конференцию FRUCT’23 (публикуется в IEEE Xplore и индексируется в Scopus). Код алгоритма доступен1 на Github.
[1] Abedjan Ziawasch, Golab Lukasz, Naumann Felix. Profiling Relational Data: A Survey // The VLDB Journal.— 2015. — aug.— Vol. 24, no. 4.— P. 557-581.— URL: https://doi.org/10.1007/ s00778-015-0389-y.
[2] Appleby Austin. SMHasher.— URL: https://github.com/ aappleby/smhasher (дата обращения: 2022-05-1).
[3] Data Profiling with Metanome / Thorsten Papenbrock, Tanja Bergmann, Moritz Finke et al. // Proc. VLDB Endow. — 2015.--aug. — Vol. 8, no. 12.-- P. 1860-1863.-- URL: http://dx.doi.org/10.14778/2824032.2824086.
[4] De Marchi Fabien, Lopes Stephane, Petit Jean-Marc. Efficient Algorithms for Mining Inclusion Dependencies // Advances in Database Technology — EDBT 2002 / Ed. by Christian S. Jensen, Simonas Sal- tenis, Keith G. Jeffery et al. — Berlin, Heidelberg : Springer Berlin Heidelberg, 2002. — P. 464-476.
[5] Desbordante: a Framework for Exploring Limits of Dependency Discovery Algorithms / Maxim Strutovskiy, Nikita Bobrov, Kirill Smirnov, George Chernishev // 2021 29th Conference of Open Innovations Association (FRUCT). — 2021. — P. 344-354.
[6] Desbordante: from benchmarking suite to high-performance science-intensive data profiler (preprint) / George A. Chernishev, Michael Polyntsov, Anton Chizhov et al. // CoRR. -- 2023. -- Vol. abs/2301.05965. —arXiv : 2301.05965.
[7] Divide & Conquer-Based Inclusion Dependency Discovery / Thorsten Papenbrock, Sebastian Kruse, Jorge-Arnulfo Quiane-Ruiz, Felix Naumann // Proc. VLDB Endow.— 2015. — feb.— Vol. 8, no. 7. -- P. 774-785. -- URL: https://doi.org/10.14778/2752939. 2752946.
[8] Fast Approximate Discovery of Inclusion Dependencies / Sebastian Kruse, Thorsten Papenbrock, Christian Dullweber et al. // Datenbanksysteme fur Business, Technologie und Web (BTW 2017), 17. Fachtagung des GI-Fachbereichs „Datenbanken und Information- ssysteme” (DBIS), 6.-10. Marz 2017, Stuttgart, Germany, Proceedings / Ed. by Bernhard Mitschang, Daniela Nicklas, Frank Leymann et al.- Vol. P-265 of LNI. - GI, 2017.- P. 207-226.- URL: https://dl.gi.de/20.500.12116/629.
[9] Fast Discovery of Inclusion Dependencies with Desbordante (paper accepted) / Alexander Smirnov, Anton Chizhov, Ilya Shchuckin et al. // 2023 33th Conference of Open Innovations Association (FRUCT).— 2023.
[10] Functional Dependency Discovery: An Experimental Evaluation of Seven Algorithms / Thorsten Papenbrock, Jens Ehrlich, Jannik Marten et al.— 2015.—jun.— Vol. 8, no. 10.— P. 1082-1093.— URL: https://doi.org/10.14778/2794367.2794377.
[11] HyperLogLog: the analysis of a near-optimal cardinality estimation algorithm / Philippe Flajolet, Eric Fusy, Olivier Gandouet, Frederic Meunier // AofA: Analysis of Algorithms / Ed. by Philippe Jacquet. — Vol. DMTCS Proceedings vol. AH, 2007 Conference on Analysis of Algorithms (AofA 07) of DMTCS Proceedings. — Juan les Pins, France : Discrete Mathematics and Theoretical Computer Science, 2007. — jun.— P. 137-156. — URL: https://hal.inria.fr/hal-00406166.
[12] Inclusion Dependency Discovery: An Experimental Evaluation of Thirteen Algorithms / Falco Dursch, Axel Stebner, Fabian Windheuser et al. — CIKM ’19.— New York, NY, USA : Association for Computing Machinery, 2019.— P. 219-228.— URL: https://doi.org/10. 1145/3357384.3357916.
[13] Kruse Sebastian, Papenbrock Thorsten, Naumann Felix. Scaling Out the Discovery of Inclusion Dependencies // Datenbanksysteme fur Business, Technologie und Web (BTW), 16. Fachtagung des GI-Fachbereichs ”Datenbanken und Informationssysteme” (DBIS), 4.6.3.2015 in Hamburg, Germany. Proceedings / Ed. by Thomas Seidl, Norbert Ritter, Harald Schoning et al. — Vol. P-241 of LNI. — GI, 2015. — P. 445-454. — URL: https://dl.gi.de/20.500.12116/2421.
[14] Leitner-Ankerl Martin. Comprehensive C++ Hashmap Benchmarks 2022.— URL: https://martin.ankerl.com/2022/08/27/ hashmap-bench-01 (дата обращения: 2022-05-1).
[15] Olist, Sionek Andre. Brazilian E-Commerce Public Dataset by Olist. — 2018. — URL: https://www.kaggle.com/dsv/195341.
...