2010-03-28 19 views
12

Voglio creare un file binario mappato in memoria; tuttavia non sono sicuro di come creare il file da mappare nel sistema. Ho letto la documentazione diverse volte e ho realizzato che ci sono 2 implementazioni di file mappati, uno in iostream e l'altro in interprocess.Esiste una differenza tra il file mappato iostream boost e il file mappato interprocesso boost?

Ragazzi, avete qualche idea su come creare un file mappato nella memoria condivisa? Sto cercando di consentire a un programma multi-threaded di leggere una matrice di double double scritta in un formato di file binario. Qual è anche la differenza tra il file mappato in iostream e interprocess?

risposta

2

Per quanto posso dire, iostreams posizionerà il file mappato nella memoria condivisa (questo è ciò che si desidera); tuttavia, interprocess colloca comunque il file nello spazio degli indirizzi di un altro processo.

Probabilmente dovresti usare iostream a meno che tu non abbia più processi (non thread) che comunicano tra loro in qualche modo.

+0

Grazie per il chiarimento Joe, proverò iostream. – Yijinsei

+2

@Joe D: non è affatto l'impressione che ottengo dalla libreria di interprocessi. In particolare, dalla documentazione: "il sistema crea una mappatura dei file per associare il file e lo spazio degli indirizzi del processo." Per più processi, ha essenzialmente condiviso la memoria con un backup del filesystem. – rcollyer

+0

Sì, ma la libreria interprocessuale, non crea un backup del filesystem, semplicemente mappa il file nella memoria condivisa di un interprete. Tuttavia iostreams lo mapperanno nella memoria per un singolo processo. Quale è probabilmente (non ho verificato l'implementazione) più efficiente. –

0

La differenza principale che vedo tra i due è il modo in cui vengono utilizzati. In boost-interprocess, per utilizzare un file mappato in memoria, si creano oggetti in tale spazio di memoria mediante il posizionamento new e tali oggetti sono automaticamente persistenti in formato binario nel file. Altri processi possono quindi mappare lo stesso file e utilizzare quegli oggetti, oppure il programma stesso può usarlo come cache persistente e ricaricarli in seguito. I file mappati in memoria in si comportano proprio come i flussi di file, con i vantaggi aggiunti di essere uno boost::iostream e fornirebbero semantica del flusso per interpretare la comunicazione.

Per un singolo processo, non c'è molto vantaggio nell'utilizzo dei file mappati in memoria boost::iostream. Tuttavia, può ridurre la latenza nel lavorare con il file poiché sarà già stato caricato in memoria. Ma ottieni questo vantaggio solo se stai costantemente riscrivendo parti del file. Per un singolo passaggio di lettura/scrittura del file, potrebbe non esserci alcuna accelerazione.