2010-08-02 4 views
4

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

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

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

Может ли memcache использоваться как-то.

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

+4

Вы должны обходить django и разговаривать непосредственно с DBM для этой загрузки, но вам нужно будет предоставить более подробную информацию для получения более конкретного ответа. – msw

+0

Удостоверьтесь, что у вас нет индексов или внешних ключей, когда вы делаете такую ​​вставку - намного быстрее их перестроить. –

ответ

1

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

3

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

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

+0

Вы можете указать некоторые веб-ресурсы для Java и JDBC – bobsr

+1

Ну, есть слишком много хороших книг и ресурсов обо всех. Например. свободный, например. http://java.sun.com/developer/Books/JDBCTutorial/. Прямо сейчас у меня здесь около моей клавиатуры http://apress.com/book/view/9781590595206 и http://oreilly.com/catalog/9780596005221/ для JDBC. Для фактического проекта мы используем http://supercsv.sourceforge.net/, потому что сначала нам нужно сделать несколько преобразований, и это проще для нас, если CSV будет красным как объекты вместо строк, прежде чем нажимать его в базу данных , –

0

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

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

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

И, самое главное, НАЗАД ВАШЕЙ БАЗЫ ДАННЫХ ПЕРВОЕ! Единственное, что хуже, чем восстановление вашей базы данных из резервной копии из-за винта импорта, не имеет текущей резервной копии для восстановления.

0

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

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

+0

может работать команда mysql LOAD с django поля ManyToManyField – bobsr

0

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

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

Смежные вопросы