Я планирую загрузить миллиард записей, взятых из ~ 750 файлов (каждый ~ 250 МБ) в базу данных, используя django ORM. В настоящее время для обработки каждого файла требуется ~ 20 минут, и мне было интересно, есть ли способ ускорить этот процесс.
Я принял следующие меры:
- Используйте @action.commit_manually и фиксируйте один раз каждые 5000 записей.
- Установите DEBUG = False, чтобы django не накапливал все команды sql в памяти
- Цикл, выполняющий записи в одном файле, полностью содержится в одной функции (минимизируйте изменения в стеке)
- Воздержался от попадания в базу данных для запросов (использовал локальный хеш объектов, уже находящихся в базе данных, вместо использования get_or_create)
- Установите force_insert = True в save() в надежде сохранить некоторую логику в django
- Явно установите идентификатор в надежде, что это спасет Джанго от логики
- Общая минимизация и оптимизация кода
Что еще я могу сделать, чтобы ускорить процесс? Вот некоторые из моих мыслей:
- Используйте какой-нибудь Python-компилятор или версию, которая быстрее (Psyco?)
- Переопределите ORM и используйте SQL напрямую
- Используйте какой-нибудь сторонний код, который может быть лучше (1, 2)
- Прошу сообщество django создать функцию bulk_insert
Любые указатели относительно этих предметов или любые другие идеи будут приветствоваться :)