2012-06-10 4 views
5

XML을 데이터 저장소로 사용하는 두 개의 .NET 응용 프로그램을 독립적으로 실행할 수 있습니다 (임의의 순서로 시작하거나 하나만 실행할 수도 있음). 따라서 두 응용 프로그램 모두 XML 파일을 읽고 쓸 수 있습니다. 데이터를 업데이트하려면 디스크에서 읽기 및 쓰기 작업을 수행하기 전에 매번 XML 파일을로드합니다. 그리고 특정 노드를 쿼리하기 위해 XPath 쿼리를 사용하고 있습니다. 하나의 응용 프로그램에서 매초 XML에 대한 읽기 및 쓰기 요청이 있으므로 (폴링을 사용하고 변경할 수 없음)이 메서드에서 성능 문제가 발생했습니다. 정확하게 성능에 영향을 미치는 원인을 정확히 모르겠습니다 만 그것의 지속적인 읽기 쓰기.XML 읽기 쓰기 성능을 향상시키는 방법

.NET 4.0에서 메모리 매핑 된 파일을 사용해 보았지만 .NET 3.5 이상 버전을 사용하도록 제한되었습니다.

누구든지 나를 도와 줄 수 있습니까?

참고 : XML 노드에는 몇 가지 공통 속성, 속성 수 및 XPath 쿼리에 사용하는 ID가 있습니다.

+3

Sql Server Compact와 같은 다른 데이터 소스를 구현할 수 있습니까? 왜 그걸 바꿀 수 없니? – rcdmk

+0

그 용도로 xml과 다른 것을 사용하는 것을 고려 했습니까? 어쩌면 memcached (http://memcached.org/)? SQL? xml을 사용해야하는 경우 XmlReader 및 XmlWriter를 사용하십시오. – eyossi

+4

첫 번째 응용 프로그램을 변경할 수 없으면 옵션이 매우 제한적입니다. 나쁜 디자인은 나쁜 성능으로 이어집니다. – Filip

답변

1

파일을 단독으로여십시오. 다른 응용 프로그램은 충돌을 일으킬 수 있지만 충돌이 발생하지 않으면 확실하게 알 수 있습니다. 모든 액세스 시도가 즉시 실패하기 때문에 공유 파일에서 한 번에 많은 I/O로드를 호출 할 수 없습니다.

바라건대 잠시 기다렸다가 다시 시도하면 잘 작동합니다.

using (Stream iStream = File.Open("myfile.xml", 
      FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
{ 
    ... 
} 
2

XML은 무거운 쿼리를 위해 설계되지 않았습니다. 이 작업을 수행해야 할 경우 데이터베이스 사용을 고려하십시오. SQL Server Compact은 좋은 대안이 될 수 있습니다. XML을 고수해야하고 큰 파일로 작업해야하고 성능이 필요한 경우 XmlReader/XmlWriter은 전체 파일을 메모리로로드하지 않고 매우 빠릅니다.

+1

-1 : 앱을 변경할 수없는 경우 데이터베이스가 어떻게 도움이 될까요? –

+0

사실,이 제약 조건을 알지 못했습니다. 내 대답에 언급 된 XmlReader/XmlWriter이 경우에 갈 방법입니다. –

3

IF 당신은 성능이 I/O에서 발생하고 두 애플리케이션을 변경할 수 없다는 것을 확신합니다. 실제로 할 수있는 일은 조금 있습니다.

기존 응용 프로그램 코드가 변경되지 않은 첫 번째 솔루션 : RAM disk을 사용하십시오. 이 파일을 공유 메모리으로 사용하는 경우 다른 변경없이 수행 할 수 있습니다. 데이터가 지속되면 각 서술 후에 다른 미디어에 대한 백그라운드 복사를 수행해야합니다. 성능은 실제 공유 메모리만큼 좋지는 않지만 적어도 느린 I/O 작업을 기다릴 필요는 없습니다.

데이터를 읽어야하는 응용 프로그램에서만 변경되는 두 번째 솔루션 : 종종 XML 파일의 구문 분석이 매우 느립니다 (특히 XmlDocument을 사용하고 파일이 거의없는 경우). 이 경우 XmlReader을 사용하면 읽기 코드가 복잡해지고 XPath 쿼리를 잊어 버릴 수 있지만 성능은 XmlDocument보다 여러 번 더 좋을 것이며 파일 크기가 증가하지는 않을 것입니다.

작은 (또는 작지는 않은) 업데이트 : 두 번째 응용 프로그램의 코드 (파일을 읽을 것으로 추측합니다)를 변경하면 성능을 향상시킬 수 있습니다. 우선 매번 파일을 읽지 않습니다. 타임 스탬프를 확인하고 해당 파일 또는 다른 모든 시간에 파일을 읽거나/파싱하지 않도록 FileSystemWatcher을 등록하십시오. 이 작업을 수행하면 한 단계 앞으로 나아갈 수 있습니다 : 변경된 경우에만 파일을 읽고/구문 분석하고 배경에 XmlDocument을 준비하고 (다른 스레드) 폴링 요청에 사용할 수 있도록합니다.요청이 인 경우 일지라도 매우 빠른 응답 시간 (보통 파일의 경우 XmlDocument XPath 쿼리의 프로필 성능)이 표시 될 수 있습니다.

편집 : here Microsoft에서 제공하는 RAM 디스크를 찾을 수 있습니다. 그것은 매우 단순하고 순진하지만 보통 당신/우리는 그 이상을 필요로하지 않습니다. 또한 DDK에 대한 예제이기 때문에 소스 코드도 얻을 수 있습니다 (이 경우에는 재미 만).

+0

+1 - RAM 디스크는 잘못 설계된 애플리케이션과 상관없이 잘못 설계된 애플리케이션으로 수행 할 수있는 몇 가지 작업 중 하나입니다. –

+0

RAM 디스크 란 공유 파일/메모리 파일을 의미합니까? – user1447725

+0

아니요, RAM 디스크는 메모리에 남아있는 가상 디스크입니다. 응용 프로그램은 일반 드라이브로 표시됩니다 (링크가 추가됨). –

2

XML 파일을 매우 빠르게 읽는 대신 처음으로 읽은 다음 파일의 마지막 수정 시간을 가져옵니다.

데이터가 최신인지 알아야 할 때마다 파일의 수정 된 시간을 확인하고 파일이 실제로 변경된 경우에만 파일을 다시 읽습니다.

+0

해당 앱 *이 매초 파일에 기록하는 경우 많은 도움이되지 않습니다. 그러나 이러한 코드를 작성하기 전에 쉽게 확인할 수 있습니다. –

2

파일을 폴링하지 마십시오. 한 번 읽고 메모리에 보관 한 다음 FileSystemWatcher을 사용하여 을 다시로드하면 변경 될 때 만 다시로드됩니다.

또는 수정 타임 스탬프를 읽고 타임 스탬프가 변경된 경우에만 파일을 다시로드하십시오.


또한 파일을 읽을 때 독점적으로 파일을 잠그면 다른 독자는 차단되지 않습니다.

관련 문제