2010-07-07 3 views
12

큰 XML 파일 (1Gb)이 있습니다. 이 xml 파일에 대해 많은 쿼리를 작성해야합니다 (예 : xpath 사용). 결과는 XML의 작은 부분입니다. 쿼리가 가능한 빨리 수행되기를 원하지만 1Gb 파일은 작업 메모리에 너무 클 수 있습니다.큰 xml 파일의 무작위 쿼리

<all> 
    <record> 
     <id>1</id> 
     ... lots of fields. (Very different fields per record including (sometimes) subrecords 
     so mapping on a relational database would be hard). 
    </record> 
    <record> 
     <id>2</id> 
     ... lots of fields. 
    </record> 
    .. lots and lots and lots of records 
</all> 

은 내가 키로 예를 들어 사용 기록을 선택, 랜덤 액세스가 필요합니다

XML은 다음과 같이 보입니다. (이드가 가장 중요하지만 다른 필드도 키로 사용할 수 있습니다.) 나는 미리 쿼리를 알지 못하고 도착한 후 즉시 실행해야하며 일괄 실행은 아니지만 실시간으로 실행해야합니다. SAX는 모든 쿼리에 대해 전체 파일을 다시 읽지 않으므로별로 유망하지 않습니다. 그러나 DOM은 파일이 매우 커서 추가 구조 오버 헤드를 추가하는 것이 거의 확실하게 작업 메모리에 적합하지 않음을 의미하므로 매우 유망한 것으로 보입니다.

이 문제를 해결하는 데 가장 유용한 Java 라이브러리/접근 방법은 무엇입니까?

+0

_ 어떤 종류의 검색어를 작성해야합니까? 쿼리가 일괄 처리되거나 요청시 제공됩니까? 당신이 제공 할 수있는 시나리오의 다른 특징은 무엇입니까? –

+0

문제를 명확하게 설명하는 편집을위한 +1 –

답변

1

vtd-xml은 유스 케이스에 가장 적합합니다. http://vtd-xml.sourceforge.net/

+1

이것은 유망 해 보입니다. 나는 이것을 조사하고 그것이 나의 필요에 맞는다면 나는 그 질문을 대답으로 표시 할 수있다. – Jan

0

피콜로은 Java 용 매우 작고 빠른 XML 파서입니다. 유효하지 않은 파서로 SAX 1, SAX 2.0.1, and JAXP 1.1 (SAX parsing only) 인터페이스를 구현합니다. Apache의 라이센스에 available입니다.

+0

피콜로의 마지막 릴리스는 2004 년 이후이며 몇 년 전에 공개 된 버그 보고서가 있으므로 사용하지 않는 것이 좋습니다. –

4

XML을 처리 할 때는 일반적으로 스트리밍 (SAX) 또는 전체 문서를 메모리 (다양한 DOM 구현)로로드하는 두 가지 방법이 있습니다.

일괄 처리 할 쿼리 집합을 미리 설정할 수 있으면 SAX를 사용하여 파일을 스트리밍하여 일치하는 프로그램을 작성할 수 있습니다. 쿼리가 임의의 간격 (예 : 일반적인 데이터베이스 응용 프로그램)으로 제공되는 경우 전체 문서를 메모리에로드하거나 XML 문서를 전처리하여 특정 종류의 데이터베이스에 저장해야합니다.

달성하려는 목표에 대해 더 잘 설명하면 더 나은 답변을 얻을 수 있습니다.

+0

더 나은 답변에 대한 더 나은 설명은 +1 ... –

0

등의 xml 기반 데이터베이스를 사용하는 응용 프로그램에 따라 달라질 수 있습니다. http://exist.sourceforge.net/은 흥미로울 수 있습니다.