Почему чтение базы данных SQLite, параллельно записи в нее, медленное?

Всем привет. Объясните кое-что стажеру. Недавно задавал вопрос каким способом быстрее всего записать в файл и читать из файла (Какой способ чтения и записи в файл, а также сам тип файлов, наилучший в плане быстродействия при использовании Python для обработки больших данных?). Как я понял "не нужно изобретать велосипед и использовать СУБД". Ок, я так и сделал. Вместо того, чтобы создавать несколько файлов .csv я создал одну базу данных в которой было множество таблиц.
записывал в базу следующим скриптом:
import sqlite3
import pandas as pd
from datetime import datetime

from get_difference import get_change
from get_public_data import ticker


def make_ticker_db():
    while True:
        with sqlite3.connect('ticker.db')  as conn:
            request_1 = ticker()
            # time.sleep(1)
            try:
                request_2 = ticker()
                timestamp = datetime.now().strftime("%d:%m:%Y %H:%M:%S")
            except Exception as error:
                print(error)
                continue

            if request_2 == request_1:
                request_1 = request_2
            else:
                change_dict = get_change(request_1, request_2, timestamp)
                for i in change_dict:
                    pd.DataFrame(change_dict[i]).to_sql(i, conn, if_exists='append', index=False)
                    conn.commit()


if __name__ == "__main__":
    make_ticker_db()

Как видно, данные добавляются в базу постоянно. Но, как оказалось, если в это время пытаться прочесть какую-то таблицу, то процесс чтения быстротой не блещет. Читал, как и записывал, через pandas:
with sqlite3.connect('ticker.db')  as conn:
    print(pd.read_sql("SELECT * from table_name", conn))

DBeaver вообще отказывался открывать файл базы данных, пока в нее что-то записывается.
Вопрос: что я делаю не так. И как нужно делать?
  • Вопрос задан
  • 386 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Потому что SQLite, как и следует из её названия - это игрушечная СУБД, не предназначенная для конкурентного доступа.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@rPman
Партицируйте данные и структуры, может выглядит сначала странно, но это может помочь. Т.е. вместо создания одного файла sqlite делайте их несколько, продумав как именно делить данные чтобы запись и чтение по реже пересекалось.

Иногда сложно отказаться от удобства простоты и отсутствия необходимости в демоне

Да да, не обязательно пользоваться attach database, и да за локами и уже не атомарными транзакциями придется самому следить и прочее... просто нужно понимать где можно этим пренебречь а где остановиться и все же выбрать готовый мощный инструмент вида mysql/postgres/oracle...
Ответ написан
Комментировать
justhabrauser
@justhabrauser
IT specialist
Раньше SQLite блокировал базу на уровне _базы_. Как минимум при записи (возможно и при чтении, лениво читать доки).
Как оно сейчас и как этим управлять - читайте документацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы