2012-02-24 3 views
2

크기가 10MB 이하인 XML 문서가 있습니다. 상대적으로 단순한 구조이지만 이진 데이터가 많이 있습니다. 데이터를 가져 와서 db에 저장해야합니다. 시도한 jaxb 지하철 - 정말 천천히 작동합니다. 현재 jibx를 사용하고 있지만 xml 워드 프로세서를 사용하여 모든 jvm 메모리를 사용하여 언 마샬링합니다. 힙 공간 오류가 발생합니다. db가 손상됩니다. 아마도 xml을 읽을 때 뭔가 다른 것을 사용해야합니까? 제발, 조언 좀 해줘.XML 처리 - 성능 문제

편집 내 XML, 등등 "에서", "을"과 같은 정보와 함께 메시지의 종류를 나타냅니다 단지의 int와 날짜를을 문자열. 가장 큰 부분은 byte []로 된 첨부 파일이며 각 요소는 자체 요소에 있습니다. 아마 하나씩로드 할 수 있습니까? 나는 정말로 내가 뭘 해야하는지 모르겠다.

답변

1

stax를 사용하면 xml을 빠르게 수집하고 생성하는 데 좋은 답변입니다. 그것은 jvm의 일부이며, 사용하기가 매우 쉽습니다. 당신은 그것을 좋아할 것입니다 :-).

파일을 읽을 때 각 요소를 명확하게 관리하고 attibute하는 것이 중요합니다. 요소 (시작/끝)에 대한 반복을 수행하고 속성에 쉽게 액세스 할 수 있습니다. 그것은 당신이하고 싶은 것에 대한 정확성을 제공합니다. 또한 모든 것이 DOM처럼 메모리에로드되지는 않습니다.

온라인 자습서가 많이 있습니다. 여기 오라클 웹 사이트에서 발견 한 첫 번째 페이지가 있습니다. http://docs.oracle.com/javaee/5/tutorial/doc/bnbem.html

+0

제안에 감사드립니다! 내가 woodstox 구현이나 기본 시도해야합니까? – emmma1223

+1

나는 기본 것이 할 것이라고 생각한다. 나는 woodstox 하나에 대해 몰라요. – unludo

+0

Stax는 훌륭하게 작동합니다. 고맙습니다. – emmma1223

1

데이터를 XML 모델에서 Java 모델로 변환하여 데이터베이스 모델로 변환 할 수 있다는 점이 저에게 모두 잘못되었습니다. Java 객체를 거치지 않고 XML을 데이터베이스에 지원하는 도구를 찾으십시오. 데이터베이스에 XML 가져 오기가 없으면 타사 도구를 찾으십시오. Saxon의 XSLT-SQL 모듈은 아마도 바이너리 데이터를 처리 할 수있는 것이 아니지만 도구가있을 수 있습니다.

+0

하지만 일부 데이터 만 필요합니다. 나는 전체 XML 문서를 저장할 필요가 없습니다. 그것은 이렇게 간다. 나는 xml을 받는다; 일부 요소에서 일부 값을 가져와야합니다. 그들을 db에 저장하십시오. – emmma1223

1

사용할 수있는 가장 간단한 방법은 DOM (Google에서 많이 사용하는 예제)입니다.

그것은 메모리 트리 구조를 구축하는 모든 데이터를 미리로드하고 그렇게 빠른 것 및 10메가바이트 이후는 물론 메모리 내 표현이 더 큰 것 (즉를 시도 할 수 그렇게 크지 않다).

또한 DOM은 사용할 수있는 가장 단순하고/가장 쉬운 API입니다.

시도 할 수있는 또 다른 라이브러리는 Simple XML입니다. 매우 가벼우 며 API는 JAXB처럼 보이지만 더 직관적이며 간단합니다.

메모리 요구가 적은 항목이 필요하다고 생각되면 스트림 기반 파서를 사용할 수 있습니다. Stax하지만 API는 많이 다르며 IMO는 다소 "사용하기가 어렵습니다"

+0

Simple XML 및 JAXB (JSR-222) API의 복잡성 측면에서 실제 차이점은별로 없습니다 (http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to- simple.html). 또한 JAXB는 JAX-WS (SOAP)와 JAX-RS (RESTful) 모두를위한 표준 웹 서비스 바인딩 레이어이기 때문에 JAXB는 이러한 환경에서 훨씬 쉽게 사용할 수 있습니다. –

+0

제안 해 주셔서 감사합니다! 하지만 jaxb가 이미 stax를 사용하고 있지 않습니까? 어떤 메모리 사용량을 목표로해야합니까? 내 xml 문서에 대한 jaxb unmarshalling을 프로파일 링했으며 ~ 100-150MB의 메모리를 사용합니다. jibx는 25-50 % 적게 사용합니다. 다시 한번 감사드립니다. – emmma1223

+1

인스턴스를 올바르게 관리하면 (즉, 불필요한 인스턴스를 일찍 공개하는 경우) stax가 메모리를 거의 사용하지 않습니다. – unludo

2

Unludo 는 가능한 한 효율적으로이 과정을 계속 STAX를 사용할 필요가 바로 - 당신은 자바에서 XML을 구문 분석 할 수 실제로 5 가지 방법이 있습니다, 나는 프로/단점과 함께 them all here을 설명했다.

RAM (DOM 또는 XPath)의 전체 콘텐츠를 보유하는 모든 것이 너무 많은 메모리를 소비합니다. SAX는 훨씬 뛰어나다. 그러나 STAX는 요청할 때까지 STAX가 스트림에서 어떤 것도 파싱하지 않는 동안 요소를 파싱하고 처리기 구현에 전달한다. 그것은 당신에게 그것이 무엇을보고 있는지 알려주는 이벤트를 방출합니다.

즉, 나는 XPath로 사용하기 쉬운 STAX 성능을 제공하기 위해 SJXP parsing library STAX의 온탑을 만들었습니다.

당신은 말 그대로처럼, 당신이에 관심이있는 파일의 경로를 정의 : 그것은 당신이 구문 분석 할 파일을 제공 한 후 파서 (그들은 기본적으로 규칙입니다) 모든 경로를 제공 한 후

/message/data -- represents the <message><data>[STUFF HERE]</data></message> path 

그리고 및 그것은 당신이 요구 한 것과 정확히 일치하는 것을 발견했을 때 코드를 호출하는 것만으로 모든 더러운 일을합니다.

구현이 너무 효율적입니다. (농담이 아닙니다. 측정 할 수있는 오버 헤드가 없도록 기본 STAX 클래스 아래에서 구현 오버 헤드를 얻기 위해 프로필을 작성하는 데 며칠을 소비했습니다.) 매우 사용하기 쉽습니다.

참고 각 메시지와 함께 제공되는 바이트 []가 "개별 파일"이라고 말했습니까? XML 구문 분석의 의미에서 여기서 무엇을 의미하는지 모르겠습니다. 아마도 우리 중 일부는 바이너리 데이터가 XML 메시지 내부에 base64로 인코딩되어 있다고 가정했을 것입니다. 그렇지 않은 경우 각 메시지가 전 송되는 데이터의 보조 페이로드가 있으며 원하는 작업은 다음과 같습니다. 메모리 사용량을 낮게 유지하면 데이터를 한 번에 한 묶음 씩 데이터베이스로 직접 스트리밍 할 수 있습니다.

데이터베이스가 한 번에 세그먼트 값을 삽입하고 전체 바이트 [] BLOB를 필요로하지 않는 경우 메모리를 유지하기 위해 최대한 빨리 해당 바이트 []를 유선에서 DB로 가져옵니다 사용률이 낮음; 그것들이 실제로 1MB의 원시 데이터라면 각각의 연결이 많은 경우 특히 힙을 날려 버릴 가능성이 있습니다.

귀하의 연루자에 대한 더 많은 데이터를 공유하고자한다면 제안을 도울 수 있다고 확신합니다.

+0

답변 주셔서 감사합니다, 리야드. 최대한 빨리 도서관에 가보겠습니다. 내 필요에 완벽하게 보입니다. NOTE 부분은 : 실제로 xml과 메모리 사용량에 대한 얼룩에 대해 별도의 질문을했다. 시간이 있다면 확인해보기 바란다. http://stackoverflow.com/questions/9512646/stax-reading-base64-string-from- xml-into-db # comment12049388_9512646. – emmma1223