편집 : 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
및 메모리 예외를 얻을 : 그럼 난 매핑 된 파일의 뷰를 만들어보십시오.
그래서 한 번에 파일의 일부만 매핑해야하지만 찾고있는 구조체가 현재 매핑 된 뷰에 있는지 확인하는 가장 좋은 방법은 무엇입니까? 현재 매핑 된 뷰의 오프셋과 길이를 추적하고 구조체의 오프셋이 있는지 확인합니다. 이 모든 것에 대해 갈 수있는 더 좋은 방법이 있습니까?
기본 식별자가 순차적이면 알려진 크기 및 오프셋을 기반으로 한 계산을 사용할 수 있습니다. 페이지가 메모리에 있으면 좋고, 그렇지 않다면 관심 레코드가 어디에 있을지를 알기 위해 읽어야 할 오프셋의 수가 명확합니다. 순차 액세스 방법을 사용할 수없는 경우 처음부터 끝까지 파티션을 읽어야하지만 구조 및 기타 색인을 읽을 때 식별자와 파티션 오프셋을 캐싱하는 것과 같은 효율성을 높이기위한 기술을 구축 할 수 있습니다. esque '물건. –
ViewAccessor로 레코드 읽기 레코드가 작동하지만 작업 부하에 따라 더 큰 홉이 더 효율적일 수 있습니다. –
감사합니다. "기본 식별자가 순차적"이라는 것은 무엇을 의미합니까? – pfinferno