문제

네트워크를 통해 데이터 청크를 수신하는 응용 프로그램이 있으며이를 디스크에 작성합니다. 모든 청크가 접수되면 실제로 나타내는 단일 파일로 디코딩/재결합 할 수 있습니다.

메모리 매핑 된 파일을 사용하는 것이 유용한 지 궁금합니다. 먼저 단일 청크를 디스크에 작성하고 두 번째는 모두 디코딩되는 단일 파일의 경우 두 번째입니다.

내 자신의 느낌은 두 번째 경우에만 유용 할 수 있다는 것입니다. 누구든지 이것에 대한 아이디어를 얻었습니까?

편집 : C# 앱이며 X64 버전 만 계획하고 있습니다. (따라서 '가장 큰 연속 여유 공간'문제가 발생하는 것은 관련이 없어야합니다)

도움이 되었습니까?

해결책

메모리 매핑 된 파일은 상당히 큰 파일의 비교적 작은 부분 (보기)에 반복적으로 액세스 해야하는 시나리오에 유리합니다.

이 시나리오에서 운영 체제는 가장 최근에 맵핑 된 파일의 가장 최근에 사용 된 부분 만 제출하거나 아웃하여 응용 프로그램의 전체 메모리 사용 및 페이징 동작을 최적화하는 데 도움이 될 수 있습니다.

또한 메모리 매핑 된 파일은 카피 온- 쓰기와 같은 흥미로운 기능을 노출 시키거나 공유 메모리의 기초 역할을 할 수 있습니다.

시나리오의 경우 메모리 매핑 된 파일을 사용하면 청크가 주문되지 않은 경우 파일을 조립하는 데 도움이 될 수 있습니다. 그러나 최종 파일 크기를 미리 알아야합니다.

또한 청크를 작성하려면 파일에 한 번만 액세스해야합니다. 따라서 명시 적으로 구현 된 비동기 I/O에 비해 성능 이점은 거의 없지만 파일 작성자를 올바르게 구현하는 것이 더 쉽고 빠를 수 있습니다.

.NET 4에서 Microsoft는 메모리 매핑 된 파일에 대한 지원을 추가했으며 샘플 코드가 포함 된 몇 가지 포괄적 인 기사가 있습니다. http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapt-in-net-4.aspx.

다른 팁

메모리 매핑 파일은 주로 프로세스 간 통신 또는 I/O 성능 향상에 사용됩니다.

귀하의 경우 더 나은 I/O 성능을 얻으려고 노력하고 있습니까?

멍청한 것을 지적하는 것을 싫어하지만 Wikipedia는 상황에 대한 좋은 요약을 제공합니다 ...http://en.wikipedia.org/wiki/memory-mapped_file

구체적으로...

메모리 매핑 된 접근 방식은 데이터 블록이 페이지 캐시에로드되지만 아직 프로세스의 가상 메모리 공간에 매핑되지 않은 경우 작은 페이지 결함으로 비용이 있습니다. 상황에 따라 메모리 매핑 파일 I/O는 실제로 표준 파일 I/O보다 실질적으로 느리게 될 수 있습니다.

속도를 조기에 조기에 최적화하려고하는 것 같습니다. 정기적 인 파일 접근 방식이 아닌 이유는 나중에 필요한 경우 MM 파일을 리팩터링하지 않습니까?

두 경우 모두 관련이 있다고 말하고 싶습니다. 단일 청크를 메모리 맵핑 파일의 적절한 위치에 순서대로 작성하기 만하면됩니다. 물론 이것은 BitTorrent 다운로더와 같이 각 청크가 어디로 가야하는지 아는 경우에만 유용합니다. 청크가 어디로 가야하는지 알기 위해 추가 분석을 수행 해야하는 경우 메모리 맵핑 된 파일의 이점이 크지 않을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top