Я пытаюсь перенести 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, и он работает для всех данных в одном пакете