Atualmente, estou analisando um arquivo de despejo wikipedia; Estou extrair um bando de dados a partir dele usando python e persiste-lo em um db PostgreSQL. Estou sempre tentando fazer as coisas mais rápido para este arquivo é enorme (18GB). A fim de interface com PostgreSQL, estou usando psycopg2, mas este módulo parece imitar muitos outros tais DBAPIs.
De qualquer forma, eu tenho uma pergunta sobre cursor.executemany (comando, valores); parece-me como executar uma executemany uma vez a cada 1000 valores mais ou menos é melhor do que cursor.execute telefone (valor comando%) para cada um desses 5 milhões de valores (por favor confirmar ou corrigir-me!).
Mas, você vê, eu estou usando um executemany para INSERT IGNORE 1000 linhas em uma tabela que tem uma restrição de integridade UNIQUE; essa restrição não é verificado em python de antemão, por isso, quer me obrigar a SELECIONE todo o tempo (isto parece contra produtivo) ou me obrigar a ficar mais de 3 GB de RAM. Tudo isto para dizer que conto com Postgres para me avisar quando meu script tentou inserir ignorar uma linha já existente através de pegar o psycopg2.DatabaseError.
Quando meu script detecta uma inserir tais non-UNIQUE IGNORE, ele connection.rollback () (que faz ups para 1000 linhas cada vez, e espécie de faz o inútil executemany) e insira IGNORE s todos os valores de um por um.
Desde psycopg2 é tão mal documentados (como tantos grandes módulos ...), eu não consigo encontrar uma solução eficiente e eficaz. Eu ter reduzido o número de valores INSERIR IGNORE ed por executemany 1000-100 a fim de reduzir a probabilidade de uma inserção não-UNIQUE IGNORE per executemany, mas estou bastante certo seu é apenas uma maneira de dizer psycopg2 ignorar esses execeptions ou para contar o cursor para continuar a executemany.
Basicamente, este parece ser o tipo de problema que tem uma solução tão fácil e popular, que tudo o que posso fazer é pedir, a fim de aprender sobre ele.
Obrigado novamente!













