Я заполняю таблицу PostgreSQL ~ 11.000.000 строк, которые были выбраны ранее из другой базы данных.Я использую Python и psycopg2.Весь процесс занимает около 1,5 часов.Однако через ~ 30 минут я получаю исключение «соединение неожиданно закрыто».Исходный код выглядит следующим образом:
incursor = indb.cursor()
incursor.execute("SELECT ...")
indb.commit() # (1) close transaction
outcursor = outdb.cursor()
rows = 0
for (col1, col2, col3) in incursor: # incursor contains ~11.000.000 rows
outcursor.execute("INSERT ...", (col1, col2, col3)) # This fails after ~30 minutes
row += 1
if row % 100 == 0: # (2) Write data every 100 rows
outcursor.close()
outdb.commit()
outcursor = outdb.cursor()
incursor.close()
outcursor.close()
outdb.commit()
Я вставил (1)
и (2)
после первой неудачной попытки, предполагая, что открытая транзакция имеет верхний предел времени ~ 30 минут или что курсоримеет верхний предел ожидающих вставок.Кажется, что ни одно из этих предположений не соответствует действительности, и ошибка лежит где-то еще.
Обе базы данных хранятся на компьютере VirtualBox, который я подключаю через переадресацию портов с хоста.Я запускаю программу на хост-машине.
Обе базы данных предназначены только для тестирования, и у них нет других подключений для управления.Может быть, мне нужно переписать проблему, чтобы обойти это, но мне нужны очень трудоемкие вставки в другом месте (работающие приблизительно в течение нескольких дней), поэтому я очень обеспокоен некоторыми скрытыми временными ограничениями в psycopg2
или PostgreSQL.