2017-04-04 3 views
-1

편집 : downvote로가는 경우 왜 설명하십시오. 누구에게 도움이되지 않습니다.MemoryMappedViewAccessor를 올바르게 사용하는 방법은 무엇입니까?

메모리 매핑 된 파일을 올바르게 사용하는 방법을 알고 싶지만 몇 가지 문제가 있습니다. 시나리오는 다음과 같습니다.

1에서 10GB까지 큰 파일이 있습니다. 이들은 structs으로 구성되며 파일의 맨 처음 부분을 제외한 모든 128 바이트입니다.

이 구조체 중 하나에 대한 임의 액세스가 빠릅니다. 필자가 읽은 것에서는 메모리 매핑 된 파일이 가장 적합합니다. 또한 다른 프로세스에서 열 수 있도록 이러한 메모리 매핑 파일이 필요하지만 파일을 읽는 것만으로는 쓰지 않습니다.

읽을 필요가있는 정확한 구조체의 바이트 오프셋을 확인할 수 있습니다.

MemoryMappedFile hFileMapping = MemoryMappedFile.CreateFromFile(rampPath, FMode, Path.GetFileNameWithoutExtension(rampPath), GetFileLength(rampPath), access); 

그러나, 다른 프로세스를 열 수 없습니다 :

먼저 나는 그렇게 같이 MEM-매핑 된 파일을 시도했다. 그래서 나는 FileStream을 가지고있는 다른 생성자가 있음을 발견했습니다. 그래서 이것을 다음과 같이 변경했습니다 :

FileStream fs = new FileStream(rampPath, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read); 
MemoryMappedFile hFileMapping = MemoryMappedFile.CreateFromFile(fs, Path.GetFileNameWithoutExtension(rampPath), GetFileLength(rampPath), access, null, HandleInheritability.Inheritable, true); 

다른 프로세스가 mem-mapped 파일을 열 수 있습니다.

MemoryMappedViewAccessor hFileAccessor = hFileMapping.CreateViewAccessor(0, GetFileLength(rampPath), MemoryMappedFileAccess.Read)); 

파일이 작은 경우는 괜찮지 만, 그들이 큰 경우 내가 out of storage 및 메모리 예외를 얻을 : 그럼 난 매핑 된 파일의 뷰를 만들어보십시오.

그래서 한 번에 파일의 일부만 매핑해야하지만 찾고있는 구조체가 현재 매핑 된 뷰에 있는지 확인하는 가장 좋은 방법은 무엇입니까? 현재 매핑 된 뷰의 오프셋과 길이를 추적하고 구조체의 오프셋이 있는지 확인합니다. 이 모든 것에 대해 갈 수있는 더 좋은 방법이 있습니까?

+1

기본 식별자가 순차적이면 알려진 크기 및 오프셋을 기반으로 한 계산을 사용할 수 있습니다. 페이지가 메모리에 있으면 좋고, 그렇지 않다면 관심 레코드가 어디에 있을지를 알기 위해 읽어야 할 오프셋의 수가 명확합니다. 순차 액세스 방법을 사용할 수없는 경우 처음부터 끝까지 파티션을 읽어야하지만 구조 및 기타 색인을 읽을 때 식별자와 파티션 오프셋을 캐싱하는 것과 같은 효율성을 높이기위한 기술을 구축 할 수 있습니다. esque '물건. –

+1

ViewAccessor로 레코드 읽기 레코드가 작동하지만 작업 부하에 따라 더 큰 홉이 더 효율적일 수 있습니다. –

+0

감사합니다. "기본 식별자가 순차적"이라는 것은 무엇을 의미합니까? – pfinferno

답변

0

제안에 대한 OP의 의견에서 @Ross Bush에게 감사드립니다.

내가 한 것은 ViewAccessor의 용량을 항상 정해진 양으로 설정 한 것입니다. 그리고 내가 필요로하는 바이트 오프셋을 가지고 있기 때문에, 바이트 오프셋이 ViewAccessor 내부에 있는지를 결정하기 위해 몇 가지 계산을 실행했습니다. 그렇지 않은 경우 ViewAccessor을 다른 오프셋/용량으로 변경하여 바이트 오프셋이 그 안에 포함되도록하십시오.

관련 문제