최대화하려는 항목에 따라 최적화 옵션이 많이 있습니다.
처리 속도가 다운로드보다 빠르면 (XPath 기반 검색 속도가 느릴 것이라고 생각하기 어렵습니다) 제한 요소는 다운로드 속도입니다. 비동기식 요청을 사용하여 한 번에 여러 파일을 다운로드 할 수 있지만 모든 파일이 동일한 서버에서 제공되는 경우 동시 다운로드가 많지 않아 성능이 향상되지 않을 수 있습니다.
다운로드하는 동안 스트림에서 XmlReader
을 만들 수 있습니다. 스트림에 대해 XPath 표현식을 실행하면 (확실하지는 않지만) 생각납니다. 그러나 그것은 실제로 당신에게 어떤 이득도주지 않습니다.
큰 오브젝트 힙에 대해 불필요하게 걱정한다고 생각합니다. 한 번에 하나의 파일을 다운로드하고 처리하는 경우 각 문자열은 LOH로 이동하여 처리되고 수집됩니다. 예, 잠재적 인 큰 개체 힙을 조각입니다 있지만 파일이 모두 8-10 MB 범위에있는 경우 문제가 발생할 가능성이 매우 낮습니다. 병적 인 파일 정렬이 있어야합니다.
그리고 실제로 문자열로 다운로드 할 필요는 없습니다. 예를 들어 20MB의 버퍼를 미리 할당하고 해당 버퍼로 다운로드 할 수 있습니다. 그런 다음 MemoryStream
영역을 랩핑하고 해당 메모리 스트림에 XmlReader
을 작성하십시오. 따라서 LOH는 단지 20MB 버퍼를 다시 사용하기 때문에 조각화되지 않습니다. 나는 절대적으로해야하지 않는 한, 나는 정말로이 길로 가지 않을 것이다.
이 작업을 할당했는지, 가능한 가장 간단한 방법으로 수행했습니다. 제한 요소는 다운로드 속도가 될 것이므로 여기서는 최적화 노력을 집중적으로 다룰 것입니다. 잠재적 인 LOH 단편화에 대해서는 전혀 염려하지 않겠지 만 문제가 생길 경우를 대비하여 백 포켓에 대체 솔루션을 보관하십시오.
이 접근 방법은 실제로 XPath 검색 속도가 얼마나 빠른지에 달려 있습니다. 10MB XML 파일을 검색하는 데 몇 밀리 초 또는 수 초가 걸리면 검색 최적화에 대해 걱정할 필요가 없습니다. 다운로드 시간은 검색 시간이 왜소해질 것입니다. 대신에 두 개 또는 네 개의 동시 다운로드를 얻을 수 있는지 여부와 각 문자열 결과를 BlockingCollection
으로 던져서 소비자 대기열에서 해당 대기열을 읽고 검색을 실행하도록 할 수 있습니다. 그 소비자 스레드는 다음 파일이 내려 오기를 기다리는 동안 많은 시간을 유휴 상태로 보낼 것입니다.
간단히 말해서, 작동 시키십시오. 그러면 빠르게 작동 시키십시오.
'압축'기술을 시도 했습니까? –