Джанго с огромной базой данных MySQL - PullRequest
4 голосов
/ 02 августа 2010

Какой лучший способ импортировать многомиллионные записи CSV-файлов в Django.

В настоящее время используется модуль Python CSV, для обработки 1 миллиона записей файла требуется 2-4 дня. Он выполняет некоторую проверку, если запись уже существует, и несколько других.

Можно ли выполнить этот процесс за несколько часов.

Можно ли как-нибудь использовать memcache.

Обновление: также есть поля django ManyToManyField, которые также обрабатываются. Как они будут использоваться с прямой нагрузкой.

Ответы [ 5 ]

3 голосов
/ 02 августа 2010

Я не уверен в вашем случае, но у нас был похожий сценарий с Django, где ~ 30 миллионам записей потребовалось более одного дня для импорта.

Поскольку наш клиент был полностью неудовлетворен (с опасностью потерять проект), после нескольких неудачных попыток оптимизации с Python, мы предприняли радикальное изменение стратегии и сделали импорт (только) с Java и JDBC (+ некоторая настройка mysql) и сократил время импорта до ~ 45 минут (с Java было очень легко оптимизировать из-за очень хорошей поддержки IDE и профилировщика).

1 голос
/ 02 августа 2010

Я бы предложил использовать MySQL Python драйвер напрямую. Кроме того, вы можете принять во внимание некоторые параметры многопоточности.

0 голосов
/ 23 января 2011

Как сказал Крейг, вам лучше сначала заполнить БД.Это подразумевает создание моделей django, которые просто соответствуют ячейкам CSV (затем вы можете создавать более совершенные модели и сценарии для перемещения данных)

Затем, db feedding: инструментом для этого является Navicat, вы можете взятьфункциональная 30-дневная демоверсия на их сайте.Он позволяет вам импортировать CSV в MySQL, сохранять профиль импорта в XML ...
Затем я запускаю сценарии управления данными из Django, а когда вы закончите, перенесите вашу модель с South, чтобы получить то, что вы хотитеили, как я уже говорил ранее, создайте другой набор моделей в своем проекте и используйте сценарии для преобразования / копирования данных.

0 голосов
/ 02 августа 2010

Как уже упоминалось, вы хотите обойти ORM и перейти непосредственно к базе данных. В зависимости от того, какой тип базы данных вы используете, вы, вероятно, найдете хорошие варианты для загрузки данных CSV напрямую. В Oracle вы можете использовать Внешние таблицы для очень высокой скорости загрузки данных, а для mysql вы можете использовать команду LOAD . Я уверен, что есть что-то похожее и для Postgres.

Загрузка нескольких миллионов записей не должна занимать около 2-4 дней; Я обычно загружаю базу данных с несколькими миллионами строк в mysql, работающую на очень загруженном компьютере за считанные минуты, используя mysqldump.

0 голосов
/ 02 августа 2010

В зависимости от формата данных (вы сказали CSV) и базы данных, вам, вероятно, будет лучше загружать данные непосредственно в базу данных (либо непосредственно в таблицы, управляемые Django, либо во временные таблицы). Например, Oracle и SQL Server предоставляют пользовательские инструменты для загрузки больших объемов данных. В случае MySQL есть много хитростей, которые вы можете сделать. Например, вы можете написать сценарий perl / python для чтения файла CSV и создать сценарий SQL с операторами вставки, а затем передать сценарий SQL непосредственно в MySQL.

Как уже говорили другие, всегда сбрасывайте свои индексы и триггеры перед загрузкой больших объемов данных, а затем добавляйте их обратно после этого - перестроение индексов после каждой вставки является основным ударом по обработке.

Если вы используете транзакции, либо отключите их, либо пакетируйте свои вставки, чтобы избежать слишком больших транзакций (определение слишком большого размера варьируется, но если вы делаете миллион строк данных, разбейте их на 1 тысяча транзакций - это, наверное, правильно).

И что самое важное, создайте резервную копию базы данных в первую очередь! Единственное, что хуже, чем восстановление базы данных из резервной копии из-за ошибки импорта, это отсутствие текущей резервной копии для восстановления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...