2010-02-20 7 views
3

다음 목적을 위해 어떤 XML 구문 분석기를 사용 하시길 권장하십니까?XML : 큰 데이터 처리

XML 파일 (공백 포함)은 약 800MB입니다. 주로 3 가지 유형의 태그를 포함합니다 (n, w 및 r이라고 부름). 그들은 id라는 속성을 가지고 있는데, 가능한 한 빨리 검색해야합니다.

필요하지 않은 속성을 제거하면 30 % 정도 절약 할 수 있습니다.

두 번째 부분 최적화를위한 첫 번째 부분 : 쉽게 특정 태그에 사용되지 않는 속성을 제거 에 대한 좋은 도구 (명령 행 리눅스와 윈도우 가능한 경우)이 있습니까? XSLT를 사용할 수 있다는 것을 알고 있습니다. 아니면 쉬운 대안이 있습니까? 또한, 나중에 구문 분석을 위해 속도를 얻기 위해 각 태그마다 하나씩 3 개의 파일로 나눌 수 있습니다. 속도는 데이터의 준비에 너무 중요하지 않습니다. 물론 시간보다 오히려 몇 분이 걸렸을 때 속도가 좋을 것입니다.

두 번째 부분 : 일단 데이터를 준비했으면 짧아 졌는지, 내가 언급 한 ID 속성을 검색 할 수 있어야합니다. 이는 시간이 중요합니다.

wc -l을 사용하는 추정치에는 3M 개의 N 태그와 418KB의 W 태그가 있다는 것을 알려줍니다. 후자의 경우 각각 약 20 개의 하위 태그를 포함 할 수 있습니다. W- 꼬리표는 또한 약간을 포함한다, 그러나 멀리 벗겨질 것입니다.

"해야 할 일"은 특정 ID 속성이 포함 된 태그 사이를 탐색하는 것입니다. 일부 태그는 다른 ID에 대한 참조를 가지므로 나무 나 어쩌면 그래프를 제공합니다. 원래 데이터는 (언급 한 바와 같이) 크지 만, 특정 요소를 선택하기 만하면되므로 결과 집합이 너무 커야합니다.

이제 이런 종류의 처리에 XML 구문 분석 라이브러리를 사용해야합니까? Java 6을 첫 번째 인스턴스에서 사용하고 BlackBerry에 이식하는 것을 염두에 두었습니다.

id를 인덱싱하고 파일에서 오프셋을 가리키는 플랫 파일을 만드는 것이 유용 할 수 있습니까? 상단 부분에서 언급 한 최적화를 수행 할 필요가 있습니까? 아니면 파서가 원본 데이터와 같이 빠른 것으로 알려져 있습니까?

작은 노트 : 테스트를 위해 파일의 마지막 줄에있는 id를 grep을 사용하여 id를 검색했습니다. 이것은 Core 2 Duo에서 1 분 정도 걸렸습니다.

파일 크기가 더 커지면 어떻게됩니까? 5GB를 가정 해 봅시다.

통지 또는 권장 사항에 감사드립니다. 미리 감사드립니다.

+0

vtd-xml에는 최대 256GB 크기의 xml을 처리하는 확장 버전이 있습니다. –

+0

@Michael B.예, 좋은 팁은 BlackBerry – Atmocreations

답변

4

Bouman이 지적한 것처럼 순수 텍스트 처리로 처리하면 최상의 속도를 얻을 수 있습니다.

XML로 처리하려면 실용적인 유일한 방법은 SAX 파서를 사용하는 것입니다. SAX 파서의 Java API 빌드는 완벽하게 처리 할 수 ​​있으므로 타사 라이브러리를 설치할 필요가 없습니다.

+0

예 +1, SAX는 문서를 통한 단일 패스를 보장합니다. 그래서 당신이 한 번에 필요한 모든 부기와 조작을 할 수 있다고 확신한다면, 확실히 시도해 볼 수 있습니다. –

+0

문제가 아직 완전히 해결되지는 않았지만 이것이 가장 도움이 된 대답입니다. 감사합니다 ... – Atmocreations

+0

기꺼이 도와 드리겠습니다. 추가 입력이 있으면 기꺼이 도와 드리겠습니다. – e4c5

1

거대한 XML 파일 작업에 XMLStarlet (http://xmlstar.sourceforge.net/)을 사용하고 있습니다. 리눅스와 윈도우 버전이 있습니다.

+0

+1과 관련이 있습니다. 당신이 XPath를 안다면 어쨌든 – Atmocreations

+0

큰 데이터에 대한 좋은 팁이 아닙니다 : P는 그것을 다루어야 만합니다. Windows 7에서이 대용량 파일의 일부 특성을 삭제하려고 시도했으며 어딘가에 메모리 부족으로 인해 계속할 수 없다고 말했습니다. – Atmocreations

+0

정보를 제공해 주셔서 감사합니다. 그런 다음 파일을 분할하는 것이 가장 좋습니다. 제발, 당신은 여기에 당신의 더 많은 행동을 말할 수 있겠습니까? 나는 또한 거대한 xml 파일을 처리하는 데 정말로 관심이있다. 고맙습니다. – Kirzilla

1

큰 XML 파일과 Java 힙 공간은 큰 문제입니다. StAX는 큰 파일에서도 작동합니다. 눈꺼풀을 때리는 일없이 1GB를 처리합니다. 여기에 StAx 사용 주제에 관한 유용한 문서가 있습니다 : XML.com 나를 약 20 분 만에 작동 시켰습니다.

+0

StAX도 내가 추천하는 것이다. SAX의 문제점 (모든 사람에게 문제는 아니지만 문제였습니다)은 파싱 루프를 제어 할 수 없다는 것입니다. StAX를 사용하면 원하는만큼 빨리 파싱을 중단 할 수 있다는 이점이 있습니다. – Trejkaz

1

다음과 같은 목적으로 XML-parser를 사용하는 것이 좋습니다. XML 파일 (형식이 지정되고 공백을 포함)은 약 800MB입니다.

아마 당신은 VTD-XML을 살펴해야합니다

그것은 주로 태그의 세 가지 유형이 포함 http://en.wikipedia.org/wiki/VTD-XML (다운로드 http://sourceforge.net/projects/vtd-xml/ 참조) (의는 N, W 및 R을 부르 자). 그들은 가능한 한 빨리 검색해야 할 id라는 속성을 가지고 있습니다.

나는 그것이 신성 모독이라고 알고 있지만 사전 처리를 위해 awk 또는 grep을 고려 했습니까? XML을 파싱 할 수없고 XML과 같은 중첩 구조에서 오류를 감지 할 수 없다는 것을 알고 있습니다. 그러나 아마도 XML이 가능한 형태 일 수 있습니다.

저는 XSLT를 사용할 수 있음을 알고 있습니다. 아니면 쉬운 대안이 있습니까?

지금까지 내가 XSLT 프로세서가 소스 문서의 DOM 트리에서 작동 알고 ... 그래서 그들은 문서에 대한 ... 구문 분석하고 메모리에 전체 문서를로드 아마 좋은 생각을해야 할 것 같은 이 큰 (또는 아마도 충분한 메모리가 있습니까?) 거기에 스트리밍 XSLT라는 것이 있습니다. 그러나이 기술은 매우 어려우며 많은 구현이 없으며 무료 AFAIK가 없으므로 시도 할 수 있습니다.

+0

XSLT는 브라우저에있을 때를 제외하고는 DOM을 사용하지 않습니다. 새 문서 만 만듭니다. – Rob

+0

@Rob 당신의 의견을 명확히 할 수 있습니까? XSLT가 DOM 트리에서 작동하지 않으면 정확히 작동합니까? 감사합니다 – e4c5

+1

Rob, XSLT 사양에서 : "XSLT에서 표현 된 변환은 소스 트리를 결과 트리로 변환하는 규칙을 설명합니다." 이제 구현은 원하는대로 어떤 방식 으로든 자유롭게 수행 할 수 있지만 AFAIK는 먼저 소스를 파싱하여 파싱을 수행합니다. 이 파스 트리가 본격적인 DOM을 따르는 지 또는 그렇지 않은지 여부는 중요하지 않습니다. 이러한 파일 크기로 인해 엄청난 양의 메모리가 필요합니다. 희망이 나는 그것을 분명히했다. –

0

xslt는 대용량 파일의 경우에도 비교적 빠른 경향이 있습니다. 대용량 파일의 경우 트릭이 먼저 DOM을 생성하지 않습니다. URL 소스 또는 스트림 소스를 사용하여 변환기에 전달하십시오.

빈 노드를 제거하고 원하지 않는 속성을 ID 변환 템플릿으로 시작하여 필터링합니다. 그런 다음 XPATH를 사용하여 필요한 태그를 검색하십시오.

또한 변화의 무리를 시도해 볼 수도 있습니다 : 작은 것들에

  • 분할 큰 XML 파일을 여전히 사용하여 구성을 보존 XML을-포함합니다. 큰 소스 파일을 더 작은 파일로 분할하고 include "x.h"종류의 개념을 사용하는 것과 매우 비슷합니다. 이렇게하면 대용량 파일을 처리 할 필요가 없을 수 있습니다.

  • ID 변환을 통해 XML을 실행하는 경우이를 사용하여 generated-id() 함수를 사용하여 관심있는 각 노드에 UNID를 할당합니다.

  • 검색을위한 프런트 엔드 데이터베이스 테이블을 작성하십시오. 위의 생성 된 UNID를 사용하여 파일에있는 데이터의 위치를 ​​신속하게 찾아냅니다.

+0

다음은 항등 변환입니다. 가장 간단한 형태로 소스 파일의 복사본을 만듭니다. 그러나 당신은 그것을 놀라 울 정도로 놀랄만한 일을하도록 조정할 수 있습니다. http://en.wikipedia.org/wiki/Identity_transform. 예를 들어, 마커 등 –

+1

srini를 추가, UNIDs, 스트립 원치 않는 노드/attribues을 할당, 파일을 분할하는 데 사용할 수 있습니다, 그것은하지 않습니다 좋은 당신이 XSLT 프로세서로 스트림을 전달할 수 있습니다 멋쟁이이지만, 그것은 내부적으로 구문 분석 트리/DOM을 어쨌든 만들 수 있습니까? 여전히 느리게 많은 XPath 식 여전히 전체 문서를 읽고 의미 문서를 구문 분석 할 필요가 XPath를 (XSLT, XQuery를)에 의존 심지어 '스트리밍'XSLT 구현, 또는 실제로 아무것도 - AFAIK이 그들이 할 일해야 할 것입니다 . –

+0

Roland, 동의했지만, 나는이 단계를 변압기에도 맡기고 싶다. 단순한 통과를 위해 필요한 것을 반대하는 이유의 존재는, DOM 우리가 보는 바와 같이, 무거운 구조입니다. 좋은 XSLT는 더 가벼운 트리를 사용할 수 있습니다. –

1

해보십시오 XmlSplit "나는 세 개의 파일로 분할 할 수". 요소, 속성 등으로 나눌 위치를 지정하는 옵션이있는 명령 줄 프로그램이며 Google과 사용자가 찾아야합니다. 너무 빠릅니다.