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의 원시 데이터라면 각각의 연결이 많은 경우 특히 힙을 날려 버릴 가능성이 있습니다.
귀하의 연루자에 대한 더 많은 데이터를 공유하고자한다면 제안을 도울 수 있다고 확신합니다.
제안에 감사드립니다! 내가 woodstox 구현이나 기본 시도해야합니까? – emmma1223
나는 기본 것이 할 것이라고 생각한다. 나는 woodstox 하나에 대해 몰라요. – unludo
Stax는 훌륭하게 작동합니다. 고맙습니다. – emmma1223