2012-07-09 2 views
8

Windows 7 64 비트에서 많은 수의 이미지 파일 (~ 10000 x 16MB)에 대한 읽기/쓰기 액세스 권한이있는 메모리 매핑 파일을 사용하고 있습니다. 내 목표는 다음과 같습니다.메모리 매핑 된 파일을 비동기 적으로 플러시하려면 어떻게해야합니까?

  1. 가능한 한 많은 데이터를 캐시합니다.

  2. 가능한 한 빨리 새 이미지를 할당하고 쓸 수 있습니다.

따라서 파일에 액세스하기 위해 메모리 매핑 된 파일을 사용하고 있습니다. 캐싱은 잘 작동하지만 OS가 실제 메모리가 거의 다 떨어지기 전에는 더티 페이지를 비우지 않습니다. 그 때문에 물리적 메모리가 채워지면 새 파일을 할당하고 쓰는 것이 아주 느립니다.

한 가지 해결책은 정기적으로 FlushViewOfFiles()을 사용하는 것이지만이 기능은 데이터가 디스크에 기록 될 때까지 반환되지 않습니다.

파일 매핑을 비동기 적으로 플러시 할 수 있습니까? 내가 찾은 유일한 해결책은 Unmap()MapViewOfFile()이지만,이 접근법을 사용하면 같은 데이터 포인터를 다시 가져올 수 없습니다. 누군가가 더 나은 접근을 제안 할 수 있습니까?

편집 :

더티 페이지의 플러싱에 결과를 고정되지 않은 메모리 영역에 VirtualUnlock()를 호출 : 조금 이상 WINAPI 문서를 읽기는 , 내가 내 문제에 대한 적절한 해결책을 찾을 것으로 보인다.

답변

2

FlushViewOfFile() 함수는 실제로 파일에 쓸 때까지 기다리지 않는다고 들었습니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366563(v=vs.85).aspx

FlushViewOfFile 기능 는 파일의 메타 데이터를 플러시하지 않으며, 그것은 변화가 기본 하드웨어 디스크 캐시에서을 플러시하고 물리적으로 디스크에 기록 될 때까지 돌아 기다리지 않습니다.

"FlushFileBuffers (...)"를 호출하면 데이터가 실제로 디스크에 기록됩니다.

관련 문제