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à?
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. –
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