2012-07-09 22 views
8

Sto utilizzando i file mappati in memoria per avere accesso in lettura/scrittura a un numero elevato di file di immagine (~ 10000 x 16 MB) in Windows 7 a 64 bit. I miei obiettivi sono:Come svuotare in modo asincrono un file mappato in memoria?

  1. Avere più dati possibile nella cache.

  2. Poter allocare nuove immagini e scrivere a quelli più velocemente possibile.

Pertanto, sto utilizzando i file mappati in memoria per accedere ai file. Il caching funziona bene, ma il sistema operativo non sta scaricando pagine sporche finché non sono quasi fuori dalla memoria fisica. A causa di ciò allocare e scrivere su nuovi file è piuttosto lento una volta che la memoria fisica è stata riempita.

Una soluzione potrebbe essere usare regolarmente FlushViewOfFiles(), ma questa funzione non tornare fino a quando i dati sono stati writen su disco.

C'è un modo per svuotare in modo asessuato un mapping di file? L'unica soluzione che ho trovato è di nuovo a Unmap() e MapViewOfFile(), ma con questo approccio non posso essere sicuro di ottenere di nuovo lo stesso puntatore di dati. Qualcuno può suggerire un approccio migliore?

Edit: Leggendo la documentazione WINAPI un po 'di più, sembra che ho trovato una soluzione adatta al mio problema:

Calling VirtualUnlock() su un intervallo di memoria che non è bloccato i risultati in un rossore di pagine sporche.

risposta

2

Ho sentito che la funzione FlushViewOfFile() non aspetta fino a quando non fisicamente scrivere su file.

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

La funzione FlushViewOfFile non scarica i metadati del file, e non vedo l'ora di tornare fino a quando le modifiche sono svuotate dalla cache del disco hardware sottostante e scritti fisicamente sul disco.

Dopo aver chiamato "FlushFileBuffers (...)", i dati verranno scritti fisicamente sul disco.

Problemi correlati