2008-11-05 2 views
8

델파이 (저는 델파이 2009를 사용합니다)에서 무엇을 사용하여 매우 큰 XML 파일 (예 : 100MB)을 가능한 빨리 처리해야하는지에 대한 권장 사항이 필요합니다.매우 큰 문서의 경우 Delphi에서 가능한 한 빠른 XML 처리

XML을 입력하고 내 프로그램에서 데이터를 액세스하고 업데이트 한 다음 수정 된 XML을 다시 내 보내야합니다.

빠른 Windows 컴퓨터에서 몇 초 내에 입출력을 수행 할 수 있기를 바랍니다.


명확화. 보고서를 개발하고 데이터를 업데이트하는 데 필요한 데이터 구조에 액세스하는 것이 중요하기 때문에 DOM을 사용해야 할 것으로 예상됩니다.이 기능이 매우 빨라야합니다.

입력은 파일 로딩을 위해 한 번만 수행되며 파일 저장을 위해 한 번만 수행됩니다. 일반적으로 종료 할 때 한 번만 수행됩니다. 이것도 빠르지 만 인 메모리 데이터 액세스 및 업데이트만큼 중요하지는 않습니다.

제 생각에는 제 3 자 파서는 입출력에만 도움이되지만 메모리에로드 된 데이터는 사용 및 수정하지 않습니다. 아니면 이걸 착각 한거야?

답변

8

질문을 올바르게 이해했다면 데이터 구조를 알고 있고 파일의 XML 구조가 아니라 데이터를 수정하고있는 것입니다.

이러한 조건에서는 이고 성능이 중요한 경우 인 경우 XML 구문 분석을 건너 뛰는 직접 텍스트 조작을 시도 할 수 있습니다.

스트림에서 읽기는 몇 가지 빠른 텍스트 검색 알고리즘을 사용합니다. Boyer-Moore, 데이터 수정이 필요한 장소를 찾으려면 수정을 수행하고 다른 스트림으로 데이터를 출력하십시오.

이것은 1 회 통과, XML 구문 분석 없음, 메모리 내부 XML 트리 작성 없음.

+0

사실, 프로그램이 시작될 때 데이터를 메모리 내 데이터 구조에 입력하려고합니다. 그런 다음 사용자가 데이터를 업데이트 할 수 있도록 허용하는 등 다양한 작업을 위해 여러 번 해당 데이터에 액세스합니다. 닫을 때 사용자는 업데이트를 저장하려고 할 것입니다. – lkessler

+0

...하지만 추천 한 직접 텍스트 조작을 사용하여 끝냈습니다. 최대한 빨리 얻을 수 있습니다. 그래서 나는 너에게 받아 들여진 대답을하고있다. – lkessler

+0

@lkessler : 공유 할 수 있습니까? – menjaraz

2

나는 전문가가 아니에요,하지만 난 합의가 SAX 파서는 DOM보다 훨씬 더 효율적이 될 것입니다 생각 ...

3

당신은 DIHtmlParser component from The Delphi Inspiration 좀보고 할 수 있습니다. "매우 빠르며 특히 거대한 파일을 파싱 할 때"매우 중요합니다. "현대의 머신에서는 점수가 초당 15MB 이상의 HTML 데이터까지 올라갑니다." 거대한 파일로 시도한 적은 없지만 꽤 좋은 경험을했습니다.

+0

매우 큰 (> 100MB) XHTML 로그 파일에이 파일을 아무 문제없이 사용했습니다. – skamradt

5

SAX는 DOM 파서 대신 고려할 가치가 있습니다.

DOM을 사용하면 문서를로드하는 오버 헤드가 발생하지만로드 된 데이터는 빠르게 액세스하고 업데이트 할 수 있습니다.

SAX를 사용하면 begin-element, end-element 등을위한 핸들러를 작성해야하지만 진행 과정에서 유연성이 훨씬 뛰어납니다.

SAX는 상황에 도움이되지 않지만 어느 지점에서든 구문 분석을 중단 할 수 있기 때문에 검색 할 때 매우 유용하므로 원하는 것을 찾으면 중지 할 수 있습니다.

변경 사항을 알기 전에 모든 데이터를 구문 분석 할 필요가없는 경우 데이터를 읽었을 때 방금 업데이트 한 SAX 처리기를 작성하고 그렇지 않으면 통과시켜 데이터를 스트리밍합니다 모든 종류의 메모리 구조에 모든 것을로드하지 않아도됩니다. 이렇게하면 매우 큰 파일로 메모리 제약 조건을 맞지 않으므로 솔루션을 매우 확장 성있게 만들 수 있습니다.

MSXML DOM 및 SAX 파서를 사용하는 경향이 있습니다. 그들이 최고 실적이 아니라고 주장 할 수 있습니다. 나는 더 많은 사람들이 그것을 개선하기 위해 노력하고 있다고 주장합니다. 그래서 그들은 더 좋아질 것입니다.

4

SimDesign의 NativeXML에 매우 만족합니다. 또한 FastXML이라는 특별 버전이 포함되어 있습니다. 아직 테스트하지는 않았지만, 빠르다고합니다.

1

이벤트 구동 SAX 방식을 고려한 경우 XML Parser library이 매우 유용 할 수 있습니다.

0

방금 ​​전에 발견 한 또 다른 가능성은 내가 구입 한 LMD ElPack package입니다. XML 지원 라이브러리가 포함되어 있습니다. "매우 빠르고 완벽하게 유니 코드 가능하며 Exe 파일에 작은 설치 공간 만 추가합니다"라고 말합니다.

LMD 7 패키지 (Delphi 2009)에 포함 된 LMDXML.pas 유닛의 소스를 보면 코드가 Michail Vlasov의 SimpleXML Release 8.0 (2006 년 7 월) 코드를 기반으로한다고합니다.

0

직접 조작 만하면 zendar의 대답에 동의 할 것입니다.

DOM 또는 SAX 구현에 대해서는 DIXml을 권장합니다.

관련 문제