我有一个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>
有没有人有这方面的经验?使用当前脚本,加载数据库需要一年的时间。
答案 0 :(得分:1)
这听起来像是生产者/消费者队列的完美工作。您只需要一个线程解析 XML - 但是当它解析项目(可能将它们转换为准备插入的某个对象类型)时,它可以将转换后的对象放到多个线程正在读取的队列中。每个消费者线程都会阻塞队列,直到队列完成&#34;完成&#34; (即生产者说不再有数据)或队列中有一个项目 - 在这种情况下它处理它(将项目添加到数据库中)然后返回等待数据。您将要试验有多少消费者线程为您提供最大吞吐量 - 这将取决于各种考虑因素,主要取决于数据库的配置方式以及与数据库的连接方式。
我对Ruby中的线程知之甚少,所以我无法给你提供示例代码,但我确信必须有一个好的标准生产者/消费者队列,剩下的应该是相当简单。