2009-04-07 3 views
5

Я работаю с 20-гигабайтным XML-файлом, который я бы хотел импортировать в базу данных SQL (желательно MySQL, так как это то, что я знаю). Похоже, что это будет обычная задача, но после того, как Google Googling немного поразмыслил, я не смог понять, как это сделать. Каков наилучший способ сделать это?Импорт XML в базу данных SQL

Я знаю, что эта способность встроена в MySQL 6.0, но сейчас это не вариант, потому что это альфа-версия разработки.

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

Спасибо.

ответ

1

Я делал это несколько раз с Python, но никогда с таким большим XML-файлом. ElementTree - отличная библиотека XML для Python, которая будет полезной. Если бы это было возможно, я бы разделил XML на небольшие файлы, чтобы упростить загрузку в память и разбор.

+1

SAX Parser полезен для разбиения большого XML-файла на куски. –

4

Вы можете использовать функцию getiterator() для итерации по XML-файлу без разбора всего объекта сразу. Вы можете сделать это с помощью ElementTree, который включен в стандартную библиотеку, или с lxml.

for record in root.getiterator('record'): 
    add_element_to_database(record) # Depends on your database interface. 
            # I recommend SQLAlchemy. 
0

Это может быть обычная задача, но, возможно, 20 ГБ не так часто встречается с MySQL, как и с SQL Server.

Я сделал это с помощью служб интеграции SQL Server и немного настраиваемого кода. Независимо от того, нужен ли вам какой-либо из них, зависит от того, что вам нужно сделать с 20 ГБ XML в базе данных. Это будет единственный столбец одной строки таблицы? Одна строка на дочерний элемент?

SQL Server имеет тип данных XML, если вы просто хотите хранить XML как XML. Этот тип позволяет выполнять запросы с помощью XQuery, позволяет создавать XML-индексы над XML и позволяет столбцу XML быть «строго типизированным», обратив его к набору XML-схем, которые вы храните в базе данных.

+0

Я бы очень хотел избавиться от XML и просто сохранить данные как столбцы с соответствующим именем. Это довольно простой формат (документы с сайта общего контента с API загрузки). –

2

Посмотрите на функцию iterparse() из ElementTree или cElementTree (я думаю cElementTree будет лучше, если вы можете использовать его)

Эта часть описывает более или менее то, что вам нужно сделать: http://effbot.org/zone/element-iterparse.htm#incremental-parsing

Этот вероятно, будет самым эффективным способом сделать это в Python. Обязательно не забудьте позвонить .clear() по соответствующим элементам (вы действительно не хотите строить дерево с памятью в 20-гигабайтном файле xml: метод .getiterator(), описанный в другом ответе, немного проще, но требует в целом, я предполагаю, что у плаката действительно было iterparse())

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