【发布时间】:2010-10-17 22:46:09
【问题描述】:
我正在处理一个 20 gig 的 XML 文件,我想将它导入 SQL 数据库(最好是 MySQL,因为这是我熟悉的)。这似乎是一项常见的任务,但在谷歌搜索了一下之后,我无法弄清楚如何去做。做这个的最好方式是什么?
我知道 MySQL 6.0 中内置了此功能,但目前还不能这样做,因为它是一个 alpha 开发版本。
另外,如果我必须编写任何脚本,我更愿意使用 Python,因为这是我最熟悉的。
谢谢。
【问题讨论】:
我正在处理一个 20 gig 的 XML 文件,我想将它导入 SQL 数据库(最好是 MySQL,因为这是我熟悉的)。这似乎是一项常见的任务,但在谷歌搜索了一下之后,我无法弄清楚如何去做。做这个的最好方式是什么?
我知道 MySQL 6.0 中内置了此功能,但目前还不能这样做,因为它是一个 alpha 开发版本。
另外,如果我必须编写任何脚本,我更愿意使用 Python,因为这是我最熟悉的。
谢谢。
【问题讨论】:
MySQL documentation 似乎并不表示 XML 导入仅限于版本 6。它显然也适用于 5。
【讨论】:
看看ElementTree 或cElementTree 中的iterparse() 函数(我猜如果你可以使用cElementTree 会是最好的)
这篇文章或多或少地描述了你需要做的事情:http://effbot.org/zone/element-iterparse.htm#incremental-parsing
这可能是在 Python 中最有效的方法。确保不要忘记在适当的元素上调用 .clear()(您真的不想构建 20gig xml 文件的内存树:另一个答案中描述的 .getiterator() 方法是稍微简单一点,但确实首先需要整棵树 - 我假设海报实际上也考虑了iterparse())
【讨论】:
这可能是一项常见的任务,但也许 20GB 在 MySQL 中并不像在 SQL Server 中那样常见。
我使用 SQL Server Integration Services 和一些自定义代码完成了这项工作。您是否需要其中任何一个取决于您需要在数据库中使用 20GB 的 XML 做什么。它将是表中单行的单列吗?每个子元素一行?
如果您只想将 XML 存储为 XML,SQL Server 具有 XML 数据类型。这种类型允许您使用 XQuery 进行查询,允许您在 XML 上创建 XML 索引,并允许通过将 XML 列引用到存储在数据库中的一组 XML 模式来“强类型化”XML 列。
【讨论】:
您可以使用 getiterator() 函数来遍历 XML 文件,而无需一次解析整个文件。您可以使用包含在标准库中的ElementTree 或lxml 来执行此操作。
for record in root.getiterator('record'):
add_element_to_database(record) # Depends on your database interface.
# I recommend SQLAlchemy.
【讨论】:
我已经用 Python 做过几次了,但从来没有用过这么大的 XML 文件。 ElementTree 是一个出色的 Python XML 库,可以提供帮助。如果可能的话,我会将 XML 分成更小的文件,以便更容易加载到内存中并进行解析。
【讨论】: