2011-11-21 7 views
15

Ho passato un po 'di tempo a studiare l'IO mappato in memoria per un'applicazione su cui sto lavorando. Ho dei file molto grandi (in scala TB) e voglio mappare i segmenti da essi in memoria, sia per la lettura che per la scrittura, sfruttando al massimo il caching a livello di sistema operativo. Il software che sto scrivendo deve funzionare sotto Unix/Linux e Windows ... le prestazioni sono fondamentali.Memoria indipendente dalla piattaforma mappata [file] IO

Ho scoperto boost::iostreams::mapped_file_source e boost::iostreams::mapped_file_sink, che forniscono la maggior parte delle strutture che sto cercando. Le strutture che mi piacerebbe, ma non ho trovato sono:

  • Forzare una sincronizzazione dei dati scritti sul disco (msync (2) su Unix; FlushViewOfFile su Windows)
  • blocco dei file per evitare che due processi tentativo di scrivere lo stesso file nello stesso momento (o leggere mentre il file è ancora in fase di scrittura ..)
  • Controllo attributi del file al momento della creazione (Unix)

Posso fare queste cose usando "boost/iostreams/device/mapped_file.hpp" ? Esistono altre librerie indipendenti dalla piattaforma che meglio si adattano alle mie esigenze? Devo sviluppare la mia libreria multipiattaforma per ottenere questa flessibilità?

+0

proposito, "memory mapped I/O" si riferisce generalmente alla lettura porte I/O usando indirizzi (alias memoria mappata) (come l'utilizzo di un puntatore) anziché utilizzare speciale processore I/O istruzioni. –

+0

Punto giusto. Sto parlando di I/O di file mappati in memoria [http://en.wikipedia.org/wiki/Memory-mapped_file] - e ho modificato il titolo per riflettere questo. – aSteve

risposta

3

Vedere boost :: interprocess e boost :: interprocesso :: file_mapping. Hanno tutto ciò di cui hai bisogno.

boost::interprocess

boost::interprocess::file_mapping

+0

Forse hai ragione ... ma con boost :: interprocess, non riesco a vedere come posso (in modo diretto) stabilire l'accesso ai dati in blocchi di dimensioni di una pagina OS ... – aSteve

+0

@aSteve, questa libreria supporta la memoria mappata file, consultare: http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_mapped_files – Nim

+0

Sì, boost :: interprocess supporta i file mappati in memoria (gestiti). .. "gestito" in questo contesto implica che lo spazio nel file sia "as if" di malloc(). Ovviamente prezioso per la comunicazione tra processi, ma ho bisogno di un approccio più "non gestito"? approccio per IO "grezzo". Ho bisogno di una funzione che restituisca un puntatore a un blocco mappato contenente un offset di file arbitrario. Le interfacce boost :: iostreams :: mapped_file_ * sono ideali qui ... anche se non offrono la stessa flessibilità per sincronizzazione/blocco. Ho letto i documenti dell'interprete - Non riesco a vedere come usare interprocess per IO "raw" mappato. Aggiornamento – aSteve