Assista a pasta e importe para o banco de dados

1

Estou tentando configurar um sistema em que, sempre que um novo arquivo for criado em uma pasta, ele lerá automaticamente o conteúdo e o inserirá em um banco de dados. Esses arquivos serão principalmente arquivos .txt, mas talvez eu precise convertê-los em arquivos .csv.

Atualmente estou usando o watchdog que funciona muito bem. Ele "vigia" uma pasta específica e cria um evento toda vez que um arquivo (/ pasta) é criado, editado ou removido. Minha pergunta é qual é a melhor / mais eficiente maneira de lidar com esse evento?

Os arquivos serão adicionados todos os dias em um determinado horário (todos os dias no mesmo horário) e podem variar de 100 a 1.000 arquivos diferentes por dia. Todos os arquivos são adicionados à pasta em alguns minutos.

Meu código, usando 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()

Como você pode ver agora, o script se conecta ao banco de dados e importa test.txt (um local estático), então ele também assiste a uma pasta e imprime o que quer que aconteça. Esses dois eventos ainda estão desconectados. Assim, minha pergunta, mais especificamente, devo chamar main() toda vez que um novo on_create é acionado (portanto, uma nova conexão a cada vez)? Ou crie uma conexão com o banco de dados e observe a pasta (mantendo uma conexão aberta por toda parte) e, em seguida, chamando cursos.execute sempre que um novo on_create for acionado.

Qual seria a maneira mais eficiente?
(É claro que filepath/test.txt será alterado para o caminho dos arquivos encontrados)

Banco de dados: PostgreSQL. Python versão 2.7.

    
por John 11.03.2013 / 16:29

1 resposta

0

Eu manteria a conexão. Se você quisesse se divertir, poderia ter um tempo limite no qual, se nenhum novo arquivo chegasse em 10 minutos, você fecharia a conexão e a recriaria da próxima vez que fosse necessária.

Se você mantiver a conexão aberta, é muito importante garantir que ela não mantenha uma transação aberta. Ele deve confirmar (ou reverter) o último item de trabalho para que a transação esteja no estado <IDLE> . Não fazer isso causará problemas de desempenho do servidor de banco de dados e o uso de espaço em disco indesejado aumenta.

Você pode verificar se a transação está inativa examinando a exibição pg_stat_activity no PostgreSQL.

    
por 11.03.2013 / 23:38