Utilice la tabla COPY binaria FROM con psycopg2

Tengo decenas de millones de filas para transferir desde archivos de matriz multidimensionales a una base de datos PostgreSQL. Mis herramientas son Python y psycopg2. La forma más eficiente de datos de inserción masiva es usandocopy_from. Sin embargo, mis datos son en su mayoría números de coma flotante de 32 bits (real o float4), por lo que prefiero no convertir de real → texto → real. Aquí hay una base de datos de ejemplo DDL:

CREATE TABLE num_data
(
  id serial PRIMARY KEY NOT NULL,
  node integer NOT NULL,
  ts smallint NOT NULL,
  val1 real,
  val2 double precision
);

Aquí es donde estoy con Python usando cadenas (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()

¿Hay un equivalente que podría funcionar usando un modo binario? Es decir, ¿mantener los números de coma flotante en binario? Esto no solo preservaría la precisión del punto flotante, sino que podría ser más rápido.

(Nota: para ver la misma precisión que el ejemplo, useSET extra_float_digits='2')

Respuestas a la pregunta(1)

Su respuesta a la pregunta