2013-07-25 3 views
-1

http x (10KB 이상)의 대용량 XML 파일 (8-10MB)을 통해 다운로드해야하는 응용 프로그램이 하나의 xpath 표현식을 사용하여 일부 내용을 가져옵니다. .큰 xml 파일로 작업을 최적화하는 방법 (다운로드/구문 분석)

이 프로세스를 어떻게 최적화 할 수 있는지 궁금합니다. 이 xml 파일은 대형 오브젝트 힙으로 직접 이동합니다. - 전체 최적화 : 별도의 IO 스레드 풀을 사용하여 XML 파일을 다운로드하십시오. - 스트림을 사용하여 LOH로 갈 문자열을 읽는 대신 스트림을 사용하여 xml 파일로 웹 응답을 읽습니다. 어떻게 그렇게) - XPath는 매우 간단하고 완전한 DOM 지원이 필요하지 않으므로 Regex를 사용하여 XML에서 콘텐츠를 검색하십시오.

다른 옵션이 있습니까?

+1

'압축'기술을 시도 했습니까? –

답변

2

최대화하려는 항목에 따라 최적화 옵션이 많이 있습니다.

처리 속도가 다운로드보다 빠르면 (XPath 기반 검색 속도가 느릴 것이라고 생각하기 어렵습니다) 제한 요소는 다운로드 속도입니다. 비동기식 요청을 사용하여 한 번에 여러 파일을 다운로드 할 수 있지만 모든 파일이 동일한 서버에서 제공되는 경우 동시 다운로드가 많지 않아 성능이 향상되지 않을 수 있습니다.

다운로드하는 동안 스트림에서 XmlReader을 만들 수 있습니다. 스트림에 대해 XPath 표현식을 실행하면 (확실하지는 않지만) 생각납니다. 그러나 그것은 실제로 당신에게 어떤 이득도주지 않습니다.

큰 오브젝트 힙에 대해 불필요하게 걱정한다고 생각합니다. 한 번에 하나의 파일을 다운로드하고 처리하는 경우 각 문자열은 LOH로 이동하여 처리되고 수집됩니다. 예, 잠재적 인 큰 개체 힙을 조각입니다 있지만 파일이 모두 8-10 MB 범위에있는 경우 문제가 발생할 가능성이 매우 낮습니다. 병적 인 파일 정렬이 있어야합니다.

그리고 실제로 문자열로 다운로드 할 필요는 없습니다. 예를 들어 20MB의 버퍼를 미리 할당하고 해당 버퍼로 다운로드 할 수 있습니다. 그런 다음 MemoryStream 영역을 랩핑하고 해당 메모리 스트림에 XmlReader을 작성하십시오. 따라서 LOH는 단지 20MB 버퍼를 다시 사용하기 때문에 조각화되지 않습니다. 나는 절대적으로해야하지 않는 한, 나는 정말로이 길로 가지 않을 것이다.

이 작업을 할당했는지, 가능한 가장 간단한 방법으로 수행했습니다. 제한 요소는 다운로드 속도가 될 것이므로 여기서는 최적화 노력을 집중적으로 다룰 것입니다. 잠재적 인 LOH 단편화에 대해서는 전혀 염려하지 않겠지 만 문제가 생길 경우를 대비하여 백 포켓에 대체 솔루션을 보관하십시오.

이 접근 방법은 실제로 XPath 검색 속도가 얼마나 빠른지에 달려 있습니다. 10MB XML 파일을 검색하는 데 몇 밀리 초 또는 수 초가 걸리면 검색 최적화에 대해 걱정할 필요가 없습니다. 다운로드 시간은 검색 시간이 왜소해질 것입니다. 대신에 두 개 또는 네 개의 동시 다운로드를 얻을 수 있는지 여부와 각 문자열 결과를 BlockingCollection으로 던져서 소비자 대기열에서 해당 대기열을 읽고 검색을 실행하도록 할 수 있습니다. 그 소비자 스레드는 다음 파일이 내려 오기를 기다리는 동안 많은 시간을 유휴 상태로 보낼 것입니다.

간단히 말해서, 작동 시키십시오. 그러면 빠르게 작동 시키십시오.

관련 문제