python - pyodbc psycopg2 - лучший способ зафиксировать каждые 10 строк или 10 секунд? - PullRequest
0 голосов
/ 17 января 2019

Я часто делаю что-то похожее на приведенное ниже, что позволяет мне загружать умеренное количество строк с прерывистыми фиксациями, чтобы ускорить процесс. Если у меня много строк, конечно, я смотрю на альтернативные маршруты, такие как массовые загрузчики и т. Д.

import psycopg2

fake_row = ["a","b","c"]
rows =  [fake_row] * 100

rows_inserted = 0
commit_interval = 10

with psycopg2.connect("host=localhost") as conn, \
     conn.cursor() as cur:
    conn.autocommit = False
    for row in rows:
        cur.execute("insert into table (%s, %s, %s)", row)
        rows_inserted += 1
        if rows_inserted % commit_interval == 0:
            conn.commit()
            logging.info("I commit %s rows", rows_inserted)
    logging.info("I am done at %s rows", rows_inserted)
    conn.commit()

Теперь я рассматриваю варианты того, как это могло бы быть, если бы rows был итератором или очередью, что-то вроде погружения моего пальца в проект потокового приложения. Может быть, это служба отдыха, которая ожидает ввода, или служба, потребляющая очередь kafka. Когда он его получает, загружает строку.

Я могу получить 1000 строк одновременно; Или я могу получить один, а затем бездействовать в течение 10 минут.

То, что я хочу сделать, это что-то вроде коммит каждые 10 строк или каждые 10 секунд ... в зависимости от того, что наступит раньше. Я предпочел бы иметь более высокий уровень фиксации по соображениям производительности, но если я получу только 1/2 пакета фиксации, я не хочу оставлять свое соединение незафиксированным и открывать себя для проблем с блокировкой базы данных.

Как правильно думать об этом? Я предполагаю, что мог бы придумать что-нибудь с асинхронностью, таймерами, расписанием, может быть, сепом но я не уверен, что это будет самый чистый / самый простой / надежный.

Любые советы приветствуются.

...