Вопрос
Каков самый быстрый способ сбрасывать большой ( > 1 ГБ) XML файл в базу данных MySQL?
Данные
Данные, о которых идет речь, - это дамп данных Creative Commons Data StackOverflow.
Цель
Это будет использоваться в автономном средстве просмотра StackOverflow, которое я создаю, так как я ищу для изучения/кодирования в тех местах, где у меня не будет доступа к Интернету.
Я хочу опубликовать это для остальных членов StackOverflow для их собственного использования, когда проект будет завершен.
Проблема
Первоначально я читал из XML/записи в DB по одной записи за раз. Это заняло около 10 часов, чтобы работать на моей машине. Хакстастический код, который я использую, теперь выдает 500 записей в массив, а затем создает запрос на вставку для загрузки всего 500 одновременно (например, "INSERT INTO posts VALUES (...), (...), (...) ... ;
" ). Хотя это происходит быстрее, для выполнения все еще требуется несколько часов. Понятно, что это не лучший способ сделать это, поэтому я надеюсь, что большие мозги на этом сайте будут лучше знать.
Ограничения
- Я создаю приложение с помощью С# в качестве настольного приложения (например, 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 МБ. Это намного меньше размера файлов дампов данных.