COPY_FROM генерирует ошибку вызова .read () для массовых данных в psycopg2 - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь перенести mongodb на postgres. Я использую COPY_FROM для быстрой вставки больших объемов данных, но постоянно получаю ту же ошибку:

psycopg2.extensions.QueryCanceledError: Сбой при копировании с stdin: ошибка в .read () вызов

Мой исходный код будет пытаться заполнить таблицу за один раз, но если я разделю данные на пакеты, есть порог, до которого не выдается ошибка, который составляет около 3 миллионов записей на пакет:

# Base case (only 1 iteration) : throws .read() call error

MAX_BATCH_SIZE = total_bulk_size
iterations = math.ceil(total_bulk_size / MAX_BATCH_SIZE)
while n_batch < iterations:
      for record in batch:
         string_io_writer.writerow(row[...])
      string_io.seek(0)
      sql = 'COPY table1 FROM stdin WITH (FORMAT csv)'
      copy_expert(sql, string_io)
      postgres.commit()

# case #2: MAX_BATCH_SIZE = 5_000_000 (processing batches of 5M records)
# throws .read() call error

# case 3: MAX_BATCH_SIZE = 3_000_000 (processing batches of 3M records)
# Table is successfully populated and no error is thrown

Моя цель - заполнить таблицу как можно быстрее, поэтому разделение данных на несколько пакетов лишает смысла использование COPY_FROM.

Я думал, что это может быть проблема нехватки памяти, но я думаю, что исключение будет другим. Кроме того, я отслеживал потребление памяти, и при сбое оно не достигало 100%.

Есть идеи?

PS: я попытался использовать COPY_FROM в командной строке postgres, и он работает для всех данных в одном пакете

...