2014-10-19 3 views
0

나는 위키 피 디아 덤프를 처리하려고 시도하고 있습니다. here입니다. 특히 - enwiki-latest-pages-articles-multistream.xml.bz2 파일을 사용하십시오. 이것은 약 46GB 비 압축입니다. 현재 Java (xerces)에서 STAX 파서를 사용하고 있으며 초당 15K 페이지 요소를 추출 할 수 있습니다. 그러나 병목 현상은 파서 인 것처럼 보이고 aalto-xml로 주변에서 놀았지만 도움이되지 않았습니다.병렬 처리 Wikipedia의 XML 데이터 덤프 폭풍으로

스톰 스파우트에서 각 페이지 요소를 구문 분석하기 때문에 병목 현상이 발생합니다. 그러나, 나는 ... 태그들 사이에서 텍스트를 간단하게 출력 할 수 있고, 여러 개의 볼트가 각 페이지 요소를 병렬로 처리 할 수 ​​있다고 생각했습니다. 이것은 스톰 스파우트가 수행해야하는 작업량을 줄여줍니다. 그러나 나는 여기에 걸릴 특정 접근법을 잘 모르겠습니다. 파서를 사용하여 태그 사이의 내용을 추출하면 태그 시작 부분부터 끝까지 모든 요소를 ​​구문 분석합니다. 표준 SAX/STAX 파서에서이 오버 헤드를 제거 할 수있는 방법이 있습니까?

+0

나는 그것이 어떻게 될지 모른다. 원시 XML을 닫고 자하는 태그를 알고 싶다면 내부의 모든 XML 컨텐트를 파싱해야한다고 생각합니다. 그렇지 않으면 끝 태그는 실제로 원하는 태그와 모호 할 수 있으며, 다른 네임 스페이스는 소개 된 네임 스페이스로 인해 영향을받을 수 있습니다. 이를 달성하는 것이 일반적으로 안전하지 않은 가정을 필요로하는 것처럼 보이며 특정 상황에서만 적용될 수 있습니다. –

+0

'Xerces'는 Stax 파서가 아닙니다; 어쩌면 당신은 SAX를 생각하고 있습니까? Aalto 사용법; Xerces보다 2 배 이상 빠르기 때문에 변경 사항을 준수하지 않으면 (XMLInputFactory를 재사용하지 않는 것과 같이 XML을 생성하는 데 비용이 많이 드는 등) 잘못 사용하거나 병목 현상이 XML 구문 분석 및/또는 세대? – StaxMan

답변

0

나는 비슷한 것을 시도하여 병렬 처리했다.

많은 작업을 위해 위키 피 디아 데이터를 사용했기 때문에 한 문서에서 페린 덤프를 생성하는 것이 더 간단했습니다. 그런 다음 병렬로 여러 실험을 실행할 수 있습니다. 실행하는 데 몇 분 밖에 걸리지 않습니다. 그런 다음 Spark (귀하의 경우 Storm)에서 아주 쉽게 먹을 수있는 덤프가 있습니다.

당신이 우리의 도구를 사용하려면

확인 : https://github.com/idio/wiki2vec

0

가 XML 문서에 랜덤 액세스를 할 수있는 방법은 없지만, 많은 자바 XML 파서가 사용되지 않는 내용의 좀 더 효율적으로 건너 뛰기있다 : 예를 들어, 알토 및 Woodstox 토큰 값의 디코딩 (및 String 객체의 생성)을 연기하므로 토큰을 건너 뛴 경우 할당이 필요하지 않습니다. 이 기본 스트리밍 API (XMLStreamReader)를 통해 많은 기능을 제공하지 않지만, 모든 XMLEvent 때문에 상당한 할당 오버 헤드를 추가 않습니다 -

한 가지 STAX과 확인 내용을 버퍼링하는 특정 할 필요가없는 Event API를 사용하지하는 것입니다 만들려면 필요한지 여부에 관계없이 구성됩니다. 반면에 스트리밍 API는 이벤트/토큰의 유형만을 나타내며 호출자는 내용 (속성, 텍스트 값)이 필요한지 여부를 결정하고 대부분의 객체 할당을 피할 수 있습니다.