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')

questionAnswers(1)

yourAnswerToTheQuestion