다른 위키 피 디아 덤프 파일을 각 파일별로 하나씩 자르고 싶습니다. 나는 그것을 위해 VB App을 작성했지만 꽤 느리고 잘랐다. 현재 Im은 다른 파일을 사용하여 50MB 크기의 작은 청크로 파일을 분할하지만 오랜 시간이 걸립니다 (각 청크 당 20-30 분). 이 작업을 수행하면 개별적으로 이들 각각을 잘라낼 수 있어야합니다.대용량 XML 파일을 작은 덩어리로 자름
누구든지이 파일을 더 빨리자를 수있는 방법에 대한 제안이 있습니까?
다른 위키 피 디아 덤프 파일을 각 파일별로 하나씩 자르고 싶습니다. 나는 그것을 위해 VB App을 작성했지만 꽤 느리고 잘랐다. 현재 Im은 다른 파일을 사용하여 50MB 크기의 작은 청크로 파일을 분할하지만 오랜 시간이 걸립니다 (각 청크 당 20-30 분). 이 작업을 수행하면 개별적으로 이들 각각을 잘라낼 수 있어야합니다.대용량 XML 파일을 작은 덩어리로 자름
누구든지이 파일을 더 빨리자를 수있는 방법에 대한 제안이 있습니까?
DOM 파서를 사용하고 있다고 가정합니다. 잠재적으로 큰 파일의 경우 항상 SAX 파서를 사용해야합니다. DOM 파서는 전체 파일을 메모리로 읽어 들이고, SAX 파서는 가능한 한 적은 시간에 읽을 수 있으므로 훨씬 효율적으로 작동합니다. This tutorial은 C# SAX 파서를 작성하는 방법을 설명하고 VB는 매우 유사해야합니다.
C#에서이 작업을 수행하는 가장 쉬운 방법은 XmlReader를 사용하는 것입니다. 가장 빠른 구현을 위해 XmlReader 만 사용하거나 새로운 LINQ XNode 클래스와 결합하여 성능과 사용 편의성을 적절히 조합 할 수 있습니다. 예제는 http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx 인 MSDN 기사를 참조하십시오.
한 번에 한 문서의 노드 만 메모리에 보관 한 다음 다시 파일로 쓸 수 있도록 예제를 수정할 수 있어야합니다. 그것은 잘 수행해야하며 매우 큰 파일을 처리해야합니다.
당신은 그것에 대해 VTD-XML을 시도해야한다, 우리는 ... 사람들은 큰 XML 파일을 분할하는 얼마나 잘 작동하는지 우리에게 말하고 가지고 http://www.codeproject.com/KB/XML/xml_processing_future.aspx 우리 또한 내가이 일을한다면 DOM 영원히
을 소요했다이었다 Java에서는 javax.xml.stream.XMLEventReader 및 javax.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에 없다. 그리고 나는 그들이 당신에게 준 자바 버전과 똑같은 방식으로 작동하는지 문서에서 알 수 없다.
(제 목적은 필요한 클래스의 이름을 알려주는 것보다 문제를 해결하는 방법을 보여줄 것입니다.)