Используйте двоичную таблицу КОПИРОВАНИЯ FROM с psycopg2

У меня есть десятки миллионов строк для передачи из файлов многомерных массивов в базу данных PostgreSQL. Мои инструменты - Python и psycopg2. Самый эффективный способ массового ввода данных - использовать copy_from . Однако мои данные в основном представляют собой 32-битные числа с плавающей запятой (реальные или float4), поэтому я бы предпочел не преобразовывать реальный → текст → реальный. Вот пример DDL базы данных:

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

Вот где я нахожусь с Python, использующим строки (текст):

# 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()

Есть ли эквивалент, который мог бы работать в двоичном режиме? То есть, сохранять числа с плавающей запятой в двоичном формате? Это не только сохранит точность с плавающей запятой, но и может быть быстрее.

(Примечание: чтобы увидеть ту же точность, что и в примере, используйте SET extra_float_digits = '2' )

27
задан Mike T 16 May 2013 в 22:59
поделиться