sax 해석 xml 파일

xml 메모리가 부족합니다 사용 sax 대한 xml 파일 (1.1G) 을 처리할 때 메모리가 부족합니다, 분석을 통해 발견com.sun.org.apache.xerces.internal.util.XMLStringBuffer에서 모든 탭 모두 저축하다, 그러나 나는 handler 중 아무 데 대해 탭 이름 기억.제발 매니토 지시하다!! 까지

글쓴이 준영 작성일 2015-01-20 22:30

sax 해석 도 메모리가 부족합니다?추측할 수 있는 프로그램을 쓴 버그, 설령 수준 많이 단일 노드 크다 해도 안 때문에 메모리가 부족합니다.

글쓴이 Woong 작성일 2015-01-20 22:45

아니, 나 혼자 쓰는 작은 테스트 프로그램, 이것은 소스 코드:

package com.xml.test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxHandler extends DefaultHandler {

@Override
public void startDocument() throws SAXException {
System.out.println("......시작 문서 처리......\n");
// super.startDocument();
}

@Override
public void endDocument() throws SAXException {
System.out.println("\n......종료 확인 문서......");

// super.endDocument();
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("시작 해석 원소 " + qName);

// super.startElement(uri, localName, qName, attributes);
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("종료 확인 원소 " + qName);

// super.endElement(uri, localName, qName);
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch, start, length);

// super.characters(ch, start, length);
}
}



public class XmlTest {

public static void main(String[] args) throws Exception{
//实例化 SAXParserFactory 대상
SAXParserFactory factory = SAXParserFactory.newInstance();
System.setProperty("entityExpansionLimit", "1000000");
//解析器 만들기
SAXParser parser = factory.newSAXParser();
SaxHandler dh = new SaxHandler();
FileInputStream file = new FileInputStream("dblp.xml");
BufferedInputStream bis = new BufferedInputStream(file,1024);
InputSource is = new InputSource(bis);
parser.parse(is, dh);
}

}

이것은 실행할 때 잘못 결과를 보고하다:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(XMLStringBuffer.java:205)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.refresh(XMLDocumentScannerImpl.java:1520)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.invokeListeners(XMLEntityScanner.java:2070)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1610)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1657)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1740)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2930)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
at com.xml.test.XmlTest.main(XmlTest.java:25)


나는 소스 코드 중 어떤 운영 못 가, 그래도 어떻게 메모리가 부족합니다?!

글쓴이 준영 작성일 2015-01-20 23:10

어디 있는지 xml 파일 중 존재하는 내용은 매우 긴 속성 값.

글쓴이 Mal 작성일 2015-01-20 23:34

나는 그 xml 파일 안에 있어, 이 무슨 관계가 있니?

글쓴이 준영 작성일 2015-01-20 23:36

만약 이 바로 이 생긴 이상 이 나도 없는 것 sax 해결 방법이 대한 이런 데이터 처리 문제가 있다.

글쓴이 Mal 작성일 2015-01-21 00:06

네, 감사합니다. 그럼 내가 생각해 보니 또 다른 해결 방법이 없다.

글쓴이 준영 작성일 2015-01-21 00:34