将大型XML文件解析到数据库中。使用多个线程?

时间:2015-01-10 12:40:13

标签: mysql ruby xml multithreading

我有一个5GB + XML文件,我想解析成MySQL数据库。我目前有一个Ruby脚本,它使用Nokogiri SAX解析器将每本新书插入数据库,但这种方法非常慢,因为它逐个插入。我需要弄清楚用多个并发线程解析大文件的方法。

我在想我可以将文件拆分成多个文件,多个脚本可以在每个子文件上运行。或者让脚本将每个项目发送到后台作业以插入数据库。也许使用delayed_job,resque或sidekiq。

<?xml version="1.0"?>
<ibrary>
  <NAME>cool name</NAME>
  <book ISBN="11342343">
    <title>To Kill A Mockingbird</title>
    <description>book desc</description>
    <author>Harper Lee</author>
  </book>
  <book ISBN="989894781234">
    <title>Catcher in the Rye</title>
    <description>another description</description>
    <author>J. D. Salinger</author>
  </book>
</library>

有没有人有这方面的经验?使用当前脚本,加载数据库需要一年的时间。

1 个答案:

答案 0 :(得分:1)

这听起来像是生产者/消费者队列的完美工作。您只需要一个线程解析 XML - 但是当它解析项目(可能将它们转换为准备插入的某个对象类型)时,它可以将转换后的对象放到多个线程正在读取的队列中。每个消费者线程都会阻塞队列,直到队列完成&#34;完成&#34; (即生产者说不再有数据)或队列中有一个项目 - 在这种情况下它处理它(将项目添加到数据库中)然后返回等待数据。您将要试验有多少消费者线程为您提供最大吞吐量 - 这将取决于各种考虑因素,主要取决于数据库的配置方式以及与数据库的连接方式。

我对Ruby中的线程知之甚少,所以我无法给你提供示例代码,但我确信必须有一个好的标准生产者/消费者队列,剩下的应该是相当简单。