문제

메모리 매핑 된 파일을 사용하면 읽기 전용 또는 쓰기 전용 인 것 같습니다. 이것은 당신이 할 수 없다는 것을 의미합니다.

  • 글쓰기를 위해 열려 있고 나중에 저장하지 않기로 결정하십시오.
  • 독서를 위해 열려 있고 나중에 저장하기로 결정하십시오.

응용 프로그램은 쓰기 가능한 메모리 매핑 된 파일을 사용하여 데이터 파일을 저장하지만 사용자가 변경을 저장하지 않고 종료하려면 사용자가 실제로 편집하는 임시 파일을 사용해야합니다. 사용자가 변경 사항을 저장하기로 선택하면 원본 파일이 임시 파일로 덮어 쓰여 최신 변경 사항이 있습니다. 파일이 매우 클 수 있고 (> 1GB) 파일을 복사하는 데 시간이 오래 걸리기 때문에 번거롭습니다.

파일 매핑을 만드는 데 사용되는 플래그의 많은 조합을 시도했지만 주문형 저장의 유연성을 허용하지 않는 것 같습니다. 누구든지 이것이 사실임을 확인할 수 있습니까? 우리의 응용 프로그램은 Delphi로 작성되었지만 표준 Windows API를 사용하여 매핑을 만듭니다.

FMapHandle := CreateFileMapping(FFileHandle, nil, PAGE_READWRITE, 0, 2 * 65536, nil);
FBasePointer := MapViewOfFile(FileMapHandle, FILE_MAP_WRITE, FileOffsetHigh,
FileOffsetLow, NumBytes);
도움이 되었습니까?

해결책

나는 당신이 할 수 없다고 생각합니다. 그것은 당신을 의미합니다 5월 할 수는 있지만 나에게 의미가 없습니다 :-)

메모리 매핑 된 파일의 요점은 실제 파일의 창라는 것입니다. 파일에 반영된 변경 사항이 없으면 데이터 구조 (예 : 기본 주소, 크기 및 데이터 배열)의 변경 사항을 배치하고 저장할 때 적용하는 것과 같은 작업을 수행해야 할 것입니다.

어떤 경우에는 실제로는 그렇지 않을 것입니다 필요 메모리 매핑 된 파일은 변경하려는 청크를 읽고 유지 관리합니다 (파일을 먼저 잠금 할 가능성이있는 경우 파일을 잠그십시오).

업데이트:

저장을 할 때 원본 파일을 삭제하고 임시 파일을 원본 파일 이름으로 바꿀 가능성을 생각 했습니까? 1G의 데이터를 임시에서 원본으로 복사하는 것보다 훨씬 빠릅니다. 그렇게하면 저장을 원하지 않으면 임시 파일을 삭제하고 원본을 유지하십시오.

로드 할 때 원본 데이터를 임시 파일에 복사해야하지만 임시 데이터를 다시 복사 할 필요는 없습니다 (저장 여부에 관계없이).

다른 팁

가능하지만 사소한.

메모리 매핑 기본 사항과 메모리 맵핑 파일의 세 가지 모드의 차이점을 이해해야합니다. 둘 다 가상 주소 공간의 일부를 따로 설정하고 내부 테이블에 매핑 항목을 만듭니다. 처음에는 물리적 램이 할당되지 않았습니다. 따라서 메모리에 액세스하려고하면 CPU 결함과 OS가 수정해야합니다. 파일 내용을 RAM에 복사하고 FAULTING 주소에서 RAM을 프로세스에 매핑하여 그렇게합니다.

이제 세 모드의 차이점은 설명자가 매핑 된 페이지에 설정되는 방법입니다. 모든 경우에 페이지에서 액세스 권한을 읽습니다. (첫 번째 모드). 그러나 쓰기 액세스를 요청한 후 이후에 글을 쓰면 첫 번째 쓰기에서 페이지는 쓰기 가능하고 더러운 것으로 표시됩니다. 그런 다음 OS (두 번째 모드)의 재량에 따라 원본 파일로 다시 쓸 수 있습니다. 마지막으로, 복사 용기 시맨틱을 얻을 수 있습니다. 메모리의 페이지에 대한 읽기 만 읽기만으로 시작합니다. 글을 쓰면 CPU는 여전히 결함이 있으며 OS는 문제를 해결해야합니다. 복사기를 사용하면 원래 매핑 된 파일 대신 변경된 페이지의 백업 저장소를 페이지 파일로 설정하여 Fixup이 수행됩니다.

따라서 귀하의 경우 복사기 쓰기 모드를 사용하려고합니다. 사용자가 수정을 폐기하기로 결정하면 문제가 없습니다. 메모리 매핑을 버립니다. 메모리에서 수정 된 모든 페이지도 페이지 파일에 의해 뒷받침 된 모든 페이지도 폐기됩니다.

사용자가 저장하기로 결정하면 약간 더 어려운 작업이 있습니다. 이제 파일의 어떤 부분이 변경되었는지 알아 내야합니다. 이러한 변경 사항은 메모리에 있으며 소스 파일에 다시 적용해야합니다. 당신은 이것을 할 수 있습니다 페이지 경비원. 따라서 사용자가 저장하기로 결정하면 수정 된 모든 페이지를 별도의 메모리 블록으로 복사하고 (변경되지 않은) 파일을 재 게시하고 변경 사항을 적용하십시오.

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