2015-01-10 1 views
2

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 년이 걸립니다.

+0

죄송합니다. 분명하다고 생각했습니다. DB 삽입은 병목 현상입니다. SAX 파서는 인식하고 객체를 처리 한 후 DB 삽입이 끝날 때까지 대기 한 후 다음으로 이동합니다. DB 삽입없이 XML 파일 만 읽는 것은 그리 오래 걸리지 않습니다. 아마 30 분? 파일을 빨리 읽는 것은 문제가되지 않습니다. –

+0

삽입하기 전에 색인을 제거하십시오. –

+1

삽입물을 더 큰 배치로 그룹화하려고 했습니까? '도서 값 ('title1', 'desc1'), ('title2', 'desc2'), ...;'? 다중 삽입 작업은 한 번에 하나씩 수행하는 것보다 훨씬 빠릅니다. – Casper

답변

1

이것은 생산자/소비자 대기열에 가장 적합한 것으로 들립니다. 하나의 스레드 은 XML을으로 파싱하기를 원합니다. 그러나 항목을 파싱 할 때 (삽입 할 준비가 된 객체 유형으로 변환 할 것임) 여러 스레드가 읽는 대기열에 변환 된 객체를 넣을 수 있습니다. 각 소비자 스레드는 큐가 "완료"(즉, 생산자가 더 이상의 데이터가 없다고 말함)하거나 큐에 항목이있을 때까지 큐에서 차단됩니다. 데이터베이스)로 이동 한 다음 데이터 대기를 다시 시작합니다. 얼마나 많은 소비자 스레드가 최대 처리량을 제공하는지 실험 해보고 싶을 것입니다. 이는 다양한 고려 사항, 주로 데이터베이스 구성 방법 및 연결 방법에 따라 다릅니다.

Ruby의 스레딩에 대해서는 잘 모르기 때문에 샘플 코드를 제공 할 수는 없지만 사용 가능한 표준 프로듀서/소비자 대기열이 있어야하며 나머지는 상당히 간단해야합니다.

+0

감사합니다. 그것이 내가 생각하고있는 접근법 중 하나입니다. 소비자 대기열의 루비 버전은 일반적으로 delayed_job, resque 및/또는 sidekiq입니다. 그냥 그들과 함께 많은 경험을하지 않아 그래서 내가 여기 왜 물었습니다. AWS에서 작업을 실행할 계획입니다. 코어보다 많은 스레드를 실행하는 일반적인 경험이 있으십니까? 즉, 4 코어 인스턴스에서 10 개의 스레드를 실행하는 것이 정상입니까? –

+0

@Jeff : 스레드가 IO 바운드이면 (예 : 비동기 호출로 스레드를 피할 수없는 경우) 그렇다면 스레드보다 많은 코어를 갖는 것이 좋습니다. –

+2

루비의 [Queue] (http : //www.ruby-doc.org/core-2.2.0/Queue.html) 문서에는 소비자와 생산자를 사용하는 간단한 예제가 있습니다. 이를 사용하여 Nokogiri 코드와 [Sequel] (http://sequel.jeremyevans.net)과 같은 ORM을 사용하면 솔루션을 조합하는 것이 매우 쉽습니다. –

관련 문제