MySQL 데이터베이스로 파싱하고 싶은 5GB + XML 파일이 있습니다. 현재 Nokogiri SAX 파서를 사용하여 데이터베이스에 모든 새로운 책을 삽입하는 Ruby 스크립트가 있지만이 방법은 하나씩 삽입하기 때문에 매우 느립니다. 큰 파일을 여러 개의 동시 스레드로 파싱하는 방법을 찾아야합니다.큰 XML 파일을 데이터베이스로 구문 분석하십시오. 여러 스레드를 사용합니까?
파일을 여러 파일로 나눌 수 있고 여러 개의 스크립트가 각 서브 파일에서 작동 할 수 있다고 생각했습니다. 또는 스크립트에서 데이터베이스에 삽입 할 각 항목을 백그라운드 작업으로 보냅니다. 어쩌면 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 년이 걸립니다.
죄송합니다. 분명하다고 생각했습니다. DB 삽입은 병목 현상입니다. SAX 파서는 인식하고 객체를 처리 한 후 DB 삽입이 끝날 때까지 대기 한 후 다음으로 이동합니다. DB 삽입없이 XML 파일 만 읽는 것은 그리 오래 걸리지 않습니다. 아마 30 분? 파일을 빨리 읽는 것은 문제가되지 않습니다. –
삽입하기 전에 색인을 제거하십시오. –
삽입물을 더 큰 배치로 그룹화하려고 했습니까? '도서 값 ('title1', 'desc1'), ('title2', 'desc2'), ...;'? 다중 삽입 작업은 한 번에 하나씩 수행하는 것보다 훨씬 빠릅니다. – Casper