【发布时间】:2010-11-30 04:14:06
【问题描述】:
问题
将大型 (> 1GB) XML 文件转储到 MySQL 数据库的最快方法是什么?
数据
有问题的数据是 StackOverflow Creative Commons Data Dump。
目的
这将在我正在构建的离线 StackOverflow 查看器中使用,因为我希望在无法访问互联网的地方进行一些学习/编码。
我想在项目完成后将其发布给 StackOverflow 的其他成员,供他们自己使用。
问题
最初,我一次从 XML 读取/写入 DB 一条记录。这在我的机器上运行了大约 10 个小时。我现在使用的 hacktastic 代码将 500 条记录扔到一个数组中,然后创建一个插入查询来一次加载所有 500 条记录(例如“INSERT INTO posts VALUES (...), (...), (...) ... ;”)。虽然这更快,但仍需要数小时才能运行。显然这不是最好的方法,所以我希望这个网站上的大佬们知道更好的方法。
约束
- 我正在使用 C# 作为桌面应用程序(即 WinForms)来构建应用程序。
- 我使用 MySQL 5.1 作为我的数据库。这意味着像“
LOAD XML INFILE filename.xml”这样的特性在这个项目中是不可用的,因为这个特性只在 MySQL 5.4 及更高版本中可用。这个限制主要是因为我希望这个项目对我以外的人有用,我不想强迫人们使用 MySQL 的 Beta 版本。 - 我希望将数据加载内置到我的应用程序中(即没有说明“在运行此应用程序之前使用 'foo' 将转储加载到 MySQL 中。”)。
- 我使用的是 MySQL 连接器/网络,因此
MySql.Data命名空间中的任何内容都是可以接受的。
感谢您提供的任何指点!
目前的想法
将整个 XML 文件加载到列中,然后使用 XPath 对其进行解析的存储过程
- 这不起作用,因为文件大小受 max_allowed_packet 变量的限制,默认设置为 1 MB。这远低于数据转储文件的大小。
【问题讨论】:
-
为什么选择 MySQL?如果您正在构建离线查看器,那么 SQLite 之类的东西似乎更合适。作为奖励,它会比 MySQL 快得多。
-
老实说,马克,我误以为 SQLite 是为小型数据库设计的。我刚刚查看了该站点,虽然我确实注意到它不是针对“非常大的数据集”的评论,但我重新阅读了该部分的评论并注意到限制确实有多高。也许我会把它看作一个备用数据库。我已经计划允许使用 MSSQL。
标签: c# mysql xml load-data-infile