2014-04-23 3 views
2

500 메가 비트에서 2GB까지 다양 할 수있는 큰 크기의 xml 파일이 있습니다. 사용자 정의 태그 및 기타 유효성 검사의 총 수와 같은 과 같은 유효성 검사를 수행하려고합니다. 내 질문에 좋은 방법이있다 그래서 내가 마샬링 OutOfMemory 예외없이 자바 객체에 완전한 XML 파일을? 나는 2GB 의 램과 1536MB의 RAM을 가지고 있기 때문에 가능한 것 같지 않습니다. 그런데 대안은 무엇입니까?큰 XML 파일을 Java 객체로 변환 하시겠습니까?

STAX/SAX를 사용하여 XML을 작은 xml 파일로 분할 한 다음 별도의 개체를 사용해야합니까? 그런 다음 각 Java 오브젝트에서 고객 을 계산하십시오. 인스턴스 변수로 저장 한 다음 XML을 위해 반복하십시오. 모든 고객을 카운트로 집계하십시오. 그렇다면 분해 된 xml이 단일 xml의 일부인지 어떻게 알 수 있습니까? 아마 내가 별도의 XML 노드가 단일 XML 노드의 일부인 것을 알 수 있도록 파일 이름에 어떤 상관 ID 인 을 소개해야 할 필요가 있을까요?

+0

메모리 데이터베이스를 설정하는 것이 가능합니까? 그렇다면 stax/sax를 통해 xml을 읽고 db 테이블에 데이터를 저장할 수 있습니다. 그런 다음 SQL 쿼리를 사용하여 유효성 검사를 수행 할 수 있습니다. 그리고 H2는 별도의 jvm에서 실행되므로 메모리가 문제가되지 않습니다. – Hirak

답변

1

[최대 2GB] 크기의 xml을 구문 분석하면 RAM에 모든 내용을로드 할 필요가 없습니다. SAX 구문 분석기를 사용하여 파싱 할 수 있습니다. Here 재미있는 방법을 찾았습니다.

XMLReader r = new XMLReader(); 

    r.addHandler("node", new NodeHandler() { 

    @Override 
    public void process(StructuredNode node) { 
     System.out.println(node.queryString("name")); 
     System.out.println(node.queryValue("price").asDouble(0d)); 
    } 
    }); 

    r.parse(new FileInputStream("src/examples/test.xml")); 

기본적으로 SAX와 DOM이 혼합되어 있습니다. 처리 할 데이터가있는 요소에 대해 do를 작성합니다. 이것에 대한 코드는 MIT 라이센스하에이며, 난 당신이 좋은 튜토리얼이 도움이 될 것입니다

1

SAX (Simple API for XML) 시작하는 것입니다 일반 StAX를 파서 Here 갈 것을 제안 당신을 위해 가능하지 위의 경우 here

찾을 수 있습니다 너 여기있어. DOM을 파서 달리

, 그래서 XML 문서의 메모리 표현을 생성하지 않는 SAX 파서는 더 빠르고 더 적은 메모리를 사용합니다. 대신 SAX 파서는 클라이언트에 XML 문서 구조를 알려주고, 파서에 제공된 org.xml.sax.helpers.DefaultHandler 인스턴스의 메소드를 호출하여 콜백을 호출합니다. 문서/요소의 시작/끝과 같은 이벤트가 생성 될 때 MyHandler에 당신이 작업을 정의

SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
DefaultHandler handler = new MyHandler(); 
parser.parse("file.xml", handler); 

가 취해야 할 다음은

는 예를 구현입니다.

class MyHandler extends DefaultHandler { 

    @Override 
    public void startDocument() throws SAXException { 
    } 

    @Override 
    public void endDocument() throws SAXException { 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
    } 

    // To take specific actions for each chunk of character data (such as 
    // adding the data to a node or buffer, or printing it to a file). 
    @Override 
    public void characters(char ch[], int start, int length) 
      throws SAXException { 
    } 

} 
관련 문제