Dato l'informazioni di cui sopra, direi mmap
è un buon candidato. Ci sono alcuni motivi che dicono che: 1. Ti dà l'intero file senza realmente caricare (parte) del file fino a quando è effettivamente necessario che una parte. Questo è un vantaggio per il caricamento veloce, ma se alla fine avremo passato ogni byte [o toccato su ogni sezione 4KB del file], allora non c'è una grande differenza. 2. Il mmap
copierà solo i dati una sola volta dal disco alle tue pagine. Questo è più efficiente nei miei test rispetto alla lettura usando fread
o read
in Linux (si noti anche che la differenza tra fread
e read
per letture ragionevolmente grandi può essere ignorata.Un po 'di overhead in più nelle funzioni FILE
in C. C++ flussi per aggiungere un un bel po 'di overhead, tuttavia, nella mia esperienza [ho provato varie forme di questo più volte ormai]
Come sempre, il benchmarking brilla sempre chiedendo su Internet. Così puoi trovare ciò che ho detto sopra non è giusto nei vostri circostanze e come ha sottolineato, una volta che il codice è sufficientemente buono, alcun overhead nel codice viene sminuito dalla velocità che i dischi in grado di fornire i dati -. anche se si dispone di un sistema RAID molto di fantasia con un sacco di parallelo (SSD ?) dischi, ecc., eventualmente il trasferimento del disco s peed sarà dove si trova il collo di bottiglia. Tutto quello che puoi fare a quel punto è cercare di avere il minor numero possibile di overhead e ottenere i dati dall'applicazione il più rapidamente possibile dopo che il disco ha consegnato i dati.
Un buon punto di riferimento per "byte al secondo" è quello di utilizzare dd if=/dev/zero of=somefile bs=4K count=1M
(che scrive un file, è possibile che si desideri dd if=somefile of=/dev/null bs=4K
per vedere quanto è possibile leggere dal disco.
fonte
2013-02-11 23:39:44
Come stai programmando per accedere al file? Hai bisogno di TUTTO il file in memoria prima di poterlo utilizzare? Hai intenzione di leggere e scrivere, o semplicemente di leggere? –
Perché non iniziare con un benchmark delle prime 4 opzioni? Penso che puoi misurarlo abbastanza facilmente e probabilmente dovrai farlo comunque: quando si tratta di prestazioni, non dovresti fidarti ciecamente di tutto senza misurare. –
Sei sicuro che usare mmap sia effettivamente più lento? La memoria del tuo processo può essere scambiata allo stesso modo del contenuto del file. Inoltre, per mmap potresti provare il flag MAP_POPULATE per preimpostare le pagine del mapping. –