Оптимизация наполнения баз данных с помощью Django
У меня есть файл csv размером 10 ГБ (34 миллиона строк) с данными (без описания столбцов/заголовков), которые необходимо заполнить в базе данных Postgres. В строке данных есть столбцы, которые должны быть в разных моделях.
У меня есть следующая схема БД:
В настоящее время я делаю следующее:
- Loop through rows:
- Create instance B with specific columns from row and append to an array_b
- Create instance C with specific columns from row and append to an array_c
- Create instance A with specific columns from row and relation to B and C, and append to an array_a
- Bulk create in order: B, C and A
Это работает совершенно нормально, однако на заполнение БД уходит 4 часа. Я хотел оптимизировать процесс заполнения и наткнулся на команду psql COPY FROM. Поэтому я подумал, что смогу сделать что-то вроде:
- Create instance A with specific columns from the file
- for foreign key to C
- create instance C with specific columns from the row
- for foreign key to B
- create instance B with specific columns from the row
- for foreign key to C
- Go to 1.
После небольшого исследования того, как это сделать, я обнаружил, что он не позволяет манипулировать таблицами при копировании данных (например, просматривать другую таблицу для получения соответствующих внешних ключей для вставки)
Кто-нибудь может подсказать мне, на что обратить внимание, какой-нибудь другой метод или "хак", как оптимизировать популяцию данных?
Заранее спасибо.
Ссылки:
- Использование команды COPY FROM в PostgreSQL для вставки в несколько таблиц
- Postgres: \copy синтаксис
- Создание нескольких таблиц с помощью одного файла .sql скрипта
- https://www.sqlshack.com/different-approaches-to-sql-join-multiple-tables/ .