Domanda

Ho un'applicazione che riceve blocchi di dati attraverso la rete, e scrive questi al disco. Una volta che sono stati ricevuti tutti i pezzi, possono essere decodificati / ricombinato nel singolo file che in realtà rappresentano.

Mi chiedo se è utile utilizzare i file mappati in memoria o no -. Prima per la scrittura dei singoli pezzi su disco, la seconda per il singolo file in cui tutti sono decodificati

La mia sensazione è che potrebbe essere utile solo per il secondo caso, qualcuno ha qualche idea su questo?

Modifica: Si tratta di un app C #, e sto solo progettando una versione x64. (Così in esecuzione nel problema 'grande spazio libero contigious' non dovrebbe essere rilevante)

È stato utile?

Soluzione

file mappati in memoria sono utili per gli scenari in cui è necessario accedere ripetutamente una porzione relativamente piccola (vista) di un file molto più grande.

In questo scenario, il sistema operativo può contribuire a ottimizzare l'utilizzo della memoria complessiva e il comportamento di paging della domanda da paging dentro e fuori solo le parti utilizzate più di recente del file mappato.

Inoltre, i file mappati in memoria possono esporre caratteristiche interessanti, come copy-on-write o servire come base di memoria condivisa.

Per il vostro scenario, i file mappati in memoria può aiutare a montare il file se i pezzi arrivano fuori ordine. Tuttavia, si sarebbe ancora bisogno di conoscere la dimensione del file finale in anticipo.

Inoltre, si dovrebbe essere l'accesso ai file solo una volta, per la scrittura di un pezzo. Così, un vantaggio di prestazioni rispetto io asincrono esplicitamente implementato / O è improbabile, ma può essere più facile e veloce da implementare correttamente il vostro scrittore di file.

In .NET 4, Microsoft ha aggiunto il supporto per i file mappati in memoria e ci sono alcuni articoli completi con il codice di esempio, ad esempio, http: //blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx .

Altri suggerimenti

file mappati in memoria vengono utilizzati principalmente per Inter-Process Communication o il miglioramento delle prestazioni di I / O.

Nel tuo caso, stai cercando di ottenere una migliore prestazioni di I / O?

Odio per indicare la obivious, ma Wikipedia dà una buona carrellata della situazione ... http://en.wikipedia.org/wiki/Memory-mapped_file

In particolare ...

  

L'approccio memoria mappata ha il suo costo in pagine difetti minori - quando un blocco di dati viene caricato nella cache pagina, ma non ancora mappato in per spazio di memoria virtuale del processo. A seconda delle circostanze, memoria per i file mappato I / O può effettivamente essere sostanzialmente più lento di file standard di I / O.

Sembra che si sta per ottimizzare prematuramente per la velocità. Perché non un approccio file normale, e quindi refactoring per i file MM seguito, se necessario?

Direi entrambi i casi sono rilevanti. Basta scrivere i singoli pezzi al loro giusto posto nel file di memoria mappata, fuori uso, così come arrivano. Questo naturalmente è utile solo se si sa dove ogni pezzo dovrebbe andare, come in un downloader BitTorrent. Se è necessario eseguire alcune analisi in più per sapere dove il pezzo dovrebbe andare, il beneficio di un file di memoria mappata potrebbe non essere così grande.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top