3

将 80GB 的 XML 数据导入 MySQL 是否需要 5 天以上才能完成?

我目前正在导入一个大约 80GB 大小的 XML 文件,我正在使用的代码在这个要点中,虽然一切正常,但它已经连续运行了近 5 天,甚至还没有接近完成......

平均表大小大致为:

Data size: 4.5GB
Index size: 3.2GB
Avg. Row Length: 245
Number Rows: 20,000,000

如果需要更多信息,请告诉我!

服务器规格:

注意这是一个 linode VPS

英特尔至强处理器 L5520 - 四核 - 2.27GHZ 4GB 总 RAM

XML 示例

https://gist.github.com/2510267

谢谢!


在对这个问题进行了更多研究之后,这似乎是平均水平,我发现这个答案描述了提高进口率的方法。

4

3 回答 3

2

有很大帮助的一件事是减少提交频率,而不是每行一次。我建议从每几百行一次提交开始,然后从那里进行调整。

此外,您现在正在做的事情是进行存在性检查——转储;它大大增加了您需要运行的查询数量。相反,使用ON DUPLICATE KEY UPDATE(MySQL 扩展,不符合标准)使副本INSERT自动执行正确的操作。

Finally, consider building your tool to convert from XML into a textual form suitable for use with the mysqlimport tool, and using that bulk loader instead. This will cleanly separate the time needed for XML parsing from the time needed for database ingestion, and also speed the database import itself by using tools designed for the purpose (rather than INSERT or UPDATE commands, mysqlimport uses a specialized LOAD DATA INFILE extension).

于 2012-04-27T15:50:41.760 回答
0

这(可能)与您的速度问题无关,但我建议仔细检查 iterparse 的行为是否符合您的逻辑。在开始事件发生时,它可能已经或可能没有加载节点的文本值(取决于它是否恰好适合它解析的数据块),因此您可以获得一些相当随机的行为。

于 2012-04-27T15:12:37.313 回答
0

在没有看到你的代码的情况下,我有 3 条快速建议在尝试类似的事情之后

  1. 优化代码以实现高性能使用 lxml 在 Python 中进行高性能 XML 解析 是一篇很棒的文章。
  2. 看看pypy
  3. 重写你的代码以利用多个 cpu 的优势,而 python 本身不会这样做

做这些事情极大地提高了我从事的类似项目的速度。也许如果您发布了一些代码和示例 xml,我可以提供更深入的解决方案。(编辑,抱歉错过了要点……)

于 2012-04-27T15:21:48.707 回答