2011-01-30 4 views
3

다른 위키 피 디아 덤프 파일을 각 파일별로 하나씩 자르고 싶습니다. 나는 그것을 위해 VB App을 작성했지만 꽤 느리고 잘랐다. 현재 Im은 다른 파일을 사용하여 50MB 크기의 작은 청크로 파일을 분할하지만 오랜 시간이 걸립니다 (각 청크 당 20-30 분). 이 작업을 수행하면 개별적으로 이들 각각을 잘라낼 수 있어야합니다.대용량 XML 파일을 작은 덩어리로 자름

누구든지이 파일을 더 빨리자를 수있는 방법에 대한 제안이 있습니까?

답변

0

DOM 파서를 사용하고 있다고 가정합니다. 잠재적으로 큰 파일의 경우 항상 SAX 파서를 사용해야합니다. DOM 파서는 전체 파일을 메모리로 읽어 들이고, SAX 파서는 가능한 한 적은 시간에 읽을 수 있으므로 훨씬 효율적으로 작동합니다. This tutorial은 C# SAX 파서를 작성하는 방법을 설명하고 VB는 매우 유사해야합니다.

3

C#에서이 작업을 수행하는 가장 쉬운 방법은 XmlReader를 사용하는 것입니다. 가장 빠른 구현을 위해 XmlReader 만 사용하거나 새로운 LINQ XNode 클래스와 결합하여 성능과 사용 편의성을 적절히 조합 할 수 있습니다. 예제는 http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx 인 MSDN 기사를 참조하십시오.

한 번에 한 문서의 노드 만 메모리에 보관 한 다음 다시 파일로 쓸 수 있도록 예제를 수정할 수 있어야합니다. 그것은 잘 수행해야하며 매우 큰 파일을 처리해야합니다.

0

을 소요했다이었다 Java에서는 javax.xml.stream.XMLEventReaderjavax.xml.stream.XMLEventWriter을 사용합니다. 의사의 일종에서

, 당신이 중첩 된 <article> 태그에 대해 걱정할 필요가 없습니다,의는 <article> 태그가 각 위키 피 디아 문서를 구분합니다 가정하자, 당신은 새 파일에 기록 새로운 XMLEventWriter을 열 수있는 openNewWriter() 기능이 이 기사에 적합한 이름을 붙여주십시오.

그리고 내 코드는 다음과 같이 같을 것이다 :

XMLEventReader r = // an XMLEventReader for the original wikipedia dump 

XMLEventWriter w = null; 

bool isInsideArticle = false; 

while (r.hasNext()){ 
    XMLEvent e = r.nextEvent(); 

    if (e.isStartElement() && 
     e.asStartElement().getName().getLocalPart().equals("article")){ 
    w = openNewWriter(); 
    // write the stuff that belongs outside the <article> tag 
    // by synthesizing XMLEvents and using w.add() to add them 
    w.add(e); 
    isInsideArticle = true; 
    } else if (e.isEndElement() && 
      e.asEndElement().getName().getLocalPart().equals("article")) { 
    w.add(e); 
    // write the stuff that belongs outside the <article> tag 
    // by synthesizing XMLEvents and using w.add() to add them 
    isInsideArticle = false; 
    w.close(); 
    } else if (isInsideArticle) { 
    w.add(e); 
    } else { 
    // this tag gets dropped on the floor because it's not inside any article 
    } 
} 

지금 당신이해야 할 모든 .NET에서 스트리밍 XML 클래스를 찾을 수 있습니다. 나는 그들이 system.xml.XMLReader이고 system.xml.XMLWriter이라고 생각하지만 내 전문 지식은 .NET에 없다. 그리고 나는 그들이 당신에게 준 자바 버전과 똑같은 방식으로 작동하는지 문서에서 알 수 없다.

(제 목적은 필요한 클래스의 이름을 알려주는 것보다 문제를 해결하는 방법을 보여줄 것입니다.)

관련 문제