Вопрос
Какой самый быстрый способ вывести большой (> 1 ГБ) XML-файл в базу данных MySQL?
Данные
Данные - это дамп данных Creative Commons StackOverflow.
Назначение
Это будет использоваться в автономной программе просмотра StackOverflow, которую я создаю, так как я хочу заняться изучением / программированием в местах, где у меня не будет доступа к Интернету.
Я хотел бы сообщить об этом остальным членам StackOverflow для собственного использования после завершения проекта.
Задача
Первоначально я читал из XML / записывал в БД по одной записи за раз. Это заняло около 10 часов, чтобы запустить на моей машине. Используемый мной хакерский код теперь выбрасывает 500 записей в массив, а затем создает запрос вставки для загрузки всех 500 одновременно (например, "INSERT INTO posts VALUES (...), (...), (...) ... ;
"). В то время как это быстрее, все еще требуются часы, чтобы бежать. Ясно, что это не лучший способ, поэтому я надеюсь, что большие мозги на этом сайте узнают о лучшем способе.
Ограничения
- Я создаю приложение, используя C # в качестве настольного приложения (т.е. WinForms).
- Я использую MySQL 5.1 в качестве базы данных. Это означает, что такие функции, как "
LOAD XML INFILE filename.xml
", не могут использоваться в этом проекте, поскольку эта функция доступна только в MySQL 5.4 и выше. Это ограничение во многом связано с моей надеждой на то, что проект будет полезен для других людей, кроме меня, и я бы не стал заставлять людей использовать бета-версии MySQL.
- Я бы хотел, чтобы загрузка данных была встроена в мое приложение (т. Е. Нет инструкций для "Загрузите дамп в MySQL с помощью 'foo' перед запуском этого приложения.").
- Я использую MySQL, Connector / Net, поэтому все в пространстве имен
MySql.Data
является приемлемым.
Спасибо за любые указатели, которые вы можете предоставить!
Идеи пока что
хранимая процедура, которая загружает весь XML-файл в столбец, а затем анализирует его, используя XPath
- Это не сработало, поскольку размер файла подчиняется ограничениям переменной max_allowed_packet, для которой по умолчанию установлено значение 1 МБ. Это намного меньше размера файлов дампа данных.