Skip to content

MateussssZ/Lab3_DB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Привет!

Это бенчмарк из 5 библиотек:

  • PostgreSQL
  • SQLite
  • DuckDB
  • Pandas
  • SQLAlchemy

Для запуска понадобится установить следующие пакеты (pip install пакет)

                    psycopg2
                    sqlite3
                    duckdb
                    pandas
                    sqlalchemy

Кроме того

  • Python 3
  • Датасеты, находящиеся по ссылке
  • Все файлы с расширением .py из этого репозитория, а также конфиг .json

Основные моменты, необходимые для запуска:

  1. CSV-файлы должны находиться по пути ./DBases/file.csv от рабочей директории.
  2. SQLite будет жаловаться на датасеты, говоря, что в них есть повторяющиеся столбцы. Для этого придётся убрать(или редактировать название) последний столбец Airport_fee
  3. Для Postgres и SQLAlchemy понадобится сервер localhost с настройками user="postgres",password="password",host="127.0.0.1",port="5432"
  4. При желании можно изменить данные, описанные в пунктах 1 и 3, но тогда нужно обязательно внести изменения в config.json

Отчёт об измерениях

psycopg2

Не уверен, что стоит писать об этом, потому что дело, скорее всего, в конфигурации моей системы, но были проблемы с загрузкой большого датасета(2 Гб), оперативная память просто забивалась на все 16 Гб и происходил SIGKILL. Не знаю, в чём проблема, такого быть не должно. Проблему решил разбиением датасета на чанки, которые не забивают оперативную память до талого.

Плюсы:

✅ Хороша своей простотой и лаконичностью

✅ Библиотека, позволяющая работать с PostgreSQL

Из минусов:

❌ Вторая по медленности после SQLite(но наравне с SQLAlchemy).

❌ Первые шаги в ней делать очень сложно. Как человек, который никогда не пользовался PgAdmin4 и не создавал localhost`ы, хочу заявить, что настрадался с настройкой сервера для подключения. В этом её минус по сравнению с другими библиотеками, в которых не нужен пароль, адрес и прочая ересь.

❌ На мой взгляд, эта СУБД потихоньку изживает себя, но для новичков, изучающих основы SQL – самое то.

SQLite

Была проблема, аналогичная с psycopg2(С загрузкой большого датасета). Решил так же разбиением на чанки. Кстати, у pandas была аналогичная проблема, но, благодаря тому, что там используются объекты питона, а не sql-схемы, проблему удалось быстро решить.

Плюсы

✅ Встроенная в питон библиотека, что является очень удобным. Фаворит большинства, когда речь заходит о работе с БД в Python.

✅ Также прост, как и psycopg2 в плане написания запросов, но нет проблем с подключением к БД и настройкой, что делает эту библиотеку маленькой полевой машинкой для истребления БД. Если в рабочей папке не найден .db файл, то она сама его создаст, всё гениальное – просто.

✅ Есть встроенный движок для метода to_sql. В случае с psycopg 2, его пришлось импортировать из SQL_Alchemy..

Из минусов:

❌ Самая медленная из всех.

❌ Всего 5 типов данных, что не даёт адекватно работать с данными по типу timestamp.

❌ Также при преобразовании dataframe в sql-таблицу методом .to_sql возникла проблема с различием столбцов Airport_fee и airport_fee. SQLite думает, что это одно и то же.

Pandas

Используется ORM(когда вместо привычных запросов в виде строки мы обращаемся к таблицам и запросам, как к питоновским объектам). Также стоит отметить, что подсчёт времени не совсем честный по отношению к другим библиотекам, потому что pandas умеет кэшировать. В идеале стоит запустить каждую библиотеку на 1 прогон и посмотреть, что они выдадут.

Плюсы

✅ Удобен созданием .db файла. Только тут даже не надо закидывать всё в SQL, как в случае с SQLite, просто работаешь с датафреймом.

✅ Имеет в себе кучу удобных методов, помогающих работать с другими библиотеками, без него было бы очень тяжко, в этом деле – фаворит.

✅ Второй по скорости из 5 библиотек. Причём утирает нос SQLite, SQLAlchemy и Postgres в несколько раз.

Из минусов:

❌ No-SQL библиотека, что для некоторых является плюсом, но я кринжанул с этого.

DuckDB

Так же, как и pandas, кэширует запросы, поэтому история со временем аналогична. Но в целом показывает себя очень хорошо.

Плюсы

✅ Самая быстрая из всех библиотек. Показала какие-то заоблачные показатели, что на малом, что на большом датасете.

✅ Легко начать работать, нет мороки с подключением к серверам и импорту csv файла. Полностью самостоятельная либа, к которой даже не пришлось подключать pandas.

✅ Эта библиотека сочетает в себе плюсы psycopg2 и sqlite, но при этом лишена их недостатка – медленной работы.

✅ Умеет кэшировать

Из минусов:

❌ На первый взгляд, мало информации в интернете о том, что этотакое и как с этим работать. В целом, так и есть. Пользователи интернета не особо постят обзоры на эту либу, так как она относительно свежая. Но все проблемы уходят, если откопать официальную документацию библиотеки. Там тебя за ручку проведут, поэтому минусов, как таковых, нет.

SQLAlchemy

Ещё одна ORM библиотека. По времени схожа с psycopg2, но имеет больше перспектив, так как относительно новая.

Плюсы

✅ Можно писать как SQL, так и No-SQL expressions, причём обычные SQL запросы будут даже проще идти, но это осуждается питонистами, поэтому в данном бенчмарке используются No-SQL выражения

✅ Относительно новая библиотека, быстро набирает популярность

✅ Умеет кэшировать

Из минусов:

❌ Если использовать ORM, то получаются слишком уж большие выражения. Например, 4 запрос:

query=(select(table.c.passenger_count, extract("year", table.c.tpep_pickup_datetime),func.round(table.c.trip_distance),func.count()) #Выбрать passenger_count, year из pickup_datetime, округлённое trip_distance, count(*)
             .select_from(table) #Из tiny_table
             .group_by(table.c.passenger_count, extract("year", table.c.tpep_pickup_datetime),func.round(table.c.trip_distance)) #Сгруппировать по 1 и 2
             .order_by(extract("year", table.c.tpep_pickup_datetime),func.count())) #Упорядочить по году и count(*)

-Что за *****??

Это, конечно, можно всё убрать, сохраняя шаблонные строки и запросы, но мне это кажется запарным.

❌ Довольно медленная по сравнению с другими современными библиотеками(по скорости схожа с psycopg2)

Таблицы с получившимися замерами

Время на малом датасете(мс)

Library 1 query 2 query 3 query 4 query
psycopg2 134 194 617 648
duckdb 3 14 18 30
sqlite3 431 746 1470 2978
pandas 21 35 399 424
sqlalchemy 160 200 642 663

Время на большом датасете(мс)

Library 1 query 2 query 3 query 4 query
psycopg2 1234 1537 5966 9889
duckdb 18 100 131 220
sqlite3 4401 7456 14703 33241
pandas 21 33 432 429
sqlalchemy 1207 1630 6403 10489

About

Third laboratory work on HSE DB course

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages