1

Я пытаюсь настроить систему, которая при каждом создании нового файла в папке автоматически считывает содержимое и помещает его в базу данных. Эти файлы будут в основном .txt, но мне, возможно, придется преобразовать их в файлы .csv.

В настоящее время я использую сторожевой таймер, который прекрасно работает. Он "просматривает" определенную папку и создает событие каждый раз, когда файл (/ папка) создается, редактируется или удаляется. Мой вопрос: каков наилучший / самый эффективный способ справиться с этим событием?

Файлы будут добавляться каждый день в определенное время (каждый день в одно и то же время) и могут варьироваться от 100 до 1000 различных файлов в день. Все файлы добавляются в папку в течение нескольких минут.

Мой код, используя Psycopg:

import sys
import time
import logging
import psycopg2
import pprint
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler

def main():
    conn_string = "host='localhost' dbname='dbname' user='user' password='password'"
    print "Connecting to database\n ->%s" % (conn_string)
    conn = psycopg2.connect(conn_string)
    cursor = conn.cursor()
    cursor.execute("COPY trades FROM 'filepath/test.txt' DELIMITERS ',' CSV;")
    records = cursor.fetchall()
    pprint.pprint(records)

if __name__ == "__main__":
    main()
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    event_handler = LoggingEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Как вы можете видеть прямо сейчас, скрипт подключается к базе данных и импортирует test.txt (статическое расположение), затем он также просматривает папку и печатает все, что происходит. Эти два события еще не связаны. Таким образом, мой вопрос, более конкретно, я должен вызывать main() каждый раз, когда запускается новый on_create (таким образом, новое соединение каждый раз)? Или создайте соединение с базой данных и затем просмотрите папку (таким образом, поддерживая открытое соединение повсюду), а затем cursos.execute каждый раз, когда запускается новый on_create .

Что было бы наиболее эффективным способом?
(Конечно, filepath/test.txt будет изменен на путь найденных файлов)

База данных: PostgreSQL. Python версия 2.7.

1 ответ1

0

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

Если соединение остается открытым, очень важно убедиться, что оно не удерживает транзакцию открытой. Он должен зафиксировать (или откатить) последний элемент работы, чтобы транзакция находилась в состоянии <IDLE> . Невыполнение этого требования может привести к проблемам с производительностью сервера базы данных и нежелательному увеличению дискового пространства.

Вы можете проверить, что транзакция бездействует, изучив представление pg_stat_activity в PostgreSQL.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .