Улучшить производительность при импорте данных в MySQL? - PullRequest
1 голос
/ 14 октября 2011

Я использую Django для создания веб-сайта с бэкэндом MySQL (MyISAM).

Данные базы данных импортируются из ряда файлов XML, которые обрабатываются внешним сценарием, и выводятся в виде JSON-файла.Всякий раз, когда новый файл JSON отличается от старого, мне нужно стереть старый MySQL-db и воссоздать его с помощью manage.py loaddata (по крайней мере, это простой способ сделать это, я думаю, я мог бы проверить различия между JSONфайлы и применить их к базе данных, но я не нашел хорошего решения для этого (я не очень хороший программист и веб-разработчик)).

В любом случае, файл JSON составляет около 10Мб, и в итоге получается около 21 000 строк SQL (не ожидается значительного роста).Существует 7 таблиц, и все они выглядят примерно так:

class Subnetwork(models.Model):
   SubNetwork = models.CharField(max_length=50)
   NetworkElement = models.CharField(max_length=50)
   subNetworkId = models.IntegerField()
   longName = models.CharField(max_length=50)
   shortName = models.CharField(max_length=50)
   suffix = models.CharField(max_length=50)

Для импорта в MySQL требуется до минуты (иногда всего 30 секунд).Я не знаю, следует ли ожидать от файла такого размера?Что я могу сделать (если что-нибудь), чтобы улучшить производительность?

Для чего это стоит, вот какой-то вывод профилировщика https://gist.github.com/1287847

Ответы [ 2 ]

0 голосов
/ 19 октября 2011

Я решил это, экспортировав обработанные XML-файлы в csv вместо json, а затем использовал отдельный скрипт, который вызывал mysqlimport для выполнения импорта.

0 голосов
/ 16 октября 2011

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

  • Создайте пользовательский файл settings_build.py с from settings import *, который выбирает случайное имя для нового БД (возможно, с датой в имени БД), создает его, вызывая mysqladmin, и обновляет имя до DATABASES.
  • Создайте пользовательскую команду управления django (назовем ее builddb), либо клонировав команду loaddata, либо вызвав ее, и при успешном результате она должна записать имя БД в dbname текстовый файл с одной строкой и выполняет команду оболочки, которая перезагружает ваш сервер django ( apache / gunicorn /?).
  • Измените settings.py, чтобы загрузить имя базы данных из текстового файла.

А теперь запустите процесс сборки следующим образом:

./manage.py builddb --settings=settings_build
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...