Use a tabela binária COPY FROM com psycopg2
Tenho dezenas de milhões de linhas para transferir de arquivos de matriz multidimensionais para um banco de dados PostgreSQL. Minhas ferramentas são Python e psycopg2. A maneira mais eficiente de inserir dados em massa é usarcopy_from
. No entanto, meus dados são principalmente números de ponto flutuante de 32 bits (real ou float4), portanto, prefiro não converter de real → texto → real. Aqui está um exemplo de DDL do banco de dados:
CREATE TABLE num_data
(
id serial PRIMARY KEY NOT NULL,
node integer NOT NULL,
ts smallint NOT NULL,
val1 real,
val2 double precision
);
qui é onde estou com Python usando strings (texto):
# Just one row of data
num_row = [23253, 342, -15.336734, 2494627.949375]
import psycopg2
# Python3:
from io import StringIO
# Python2, use: from cStringIO import StringIO
conn = psycopg2.connect("dbname=mydb user=postgres")
curs = conn.cursor()
# Convert floating point numbers to text, write to COPY input
cpy = StringIO()
cpy.write('\t'.join([repr(x) for x in num_row]) + '\n')
# Insert data; database converts text back to floating point numbers
cpy.seek(0)
curs.copy_from(cpy, 'num_data', columns=('node', 'ts', 'val1', 'val2'))
conn.commit()
Existe um equivalente que possa funcionar usando um modo binário? Ou seja, mantenha os números de ponto flutuante em binário? Isso não apenas preservaria a precisão do ponto flutuante, mas também poderia ser mais rápid
(Nota: para ver a mesma precisão do exemplo, useSET extra_float_digits='2'
)