性能批量加载从XML文件到MySQL的数据

时间:2012-04-27 14:19:04

标签: python mysql xml xml-import

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

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

平均表格大小大致为:

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

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

服务器规格:

注意这是一个linode VPS

Intel Xeon Processor L5520 - 四核 - 2.27GHZ 4GB Total Ram

XML示例

https://gist.github.com/2510267

谢谢!


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

3 个答案:

答案 0 :(得分:2)

有一件事有助于提供更多的事情,而不是每次一次。我建议从每几百行开始一次提交,然后从那里调整。

此外,你现在正在做的事情是你做存在检查 - 转储那个;它大大增加了您需要运行的查询数量。相反,使用ON DUPLICATE KEY UPDATE(MySQL扩展,而不是符合标准)来复制INSERT自动做正确的事。

最后,考虑构建工具以将XML转换为适合与mysqlimport工具一起使用的文本形式,并使用该批量加载器。这将干净地将XML解析所需的时间与数据库摄取所需的时间分开,并通过使用为此目的而设计的工具(而不是INSERTUPDATE命令,{{{{{{ 1}}使用专门的mysqlimport扩展名。)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在没有看到你的代码之后,我有3个快速的建议。尝试类似的东西

  1. 优化代码以获得高性能High-performance XML parsing in Python with lxml 是一篇很棒的文章。
  2. 查看pypy
  3. 重写你的代码以利用python不会原生的多个cpu
  4. 做这些事情大大提高了我工作的类似项目的速度。 也许如果您发布了一些代码和示例xml,我可以提供更深入的解决方案。 (编辑,抱歉错过了要点......)