mmap può aiutare in qualche modo, mi spiego con alcuni esempi ipotetici:
Prima cosa: Diciamo che si sta esaurendo la memoria, e l'applicazione che hanno un pezzo 100MB di malloc'ed la memoria ottiene il 50% di esso scambiato, il che significa che il sistema operativo ha dovuto scrivere 50 MB nel file di scambio e, se hai bisogno di leggerlo, lo hai scritto, occupato e poi riletto 50 MB del tuo file di scambio.
Nel caso in cui la memoria sia stata appena memorizzata, il sistema operativo non scriverà quella parte di informazione nel file di scambio (poiché sa che i dati sono identici al file stesso), invece, farà solo un graffio di 50MB di informazioni (di nuovo: supponendo che tu non abbia scritto nulla per ora) e questo è quanto. Se hai sempre bisogno che la memoria venga nuovamente letta, il sistema operativo recupererà il contenuto non dallo swapfile, ma dal file originale che hai salvato, quindi se qualsiasi altro programma ha bisogno di 50 MB di swap, sono disponibili. Inoltre non c'è nulla di sovraccarico con la manipolazione di swapfile.
Diciamo che si legge un chunk di dati di 100 MB, e in base al 1 MB iniziale di dati di intestazione, l'informazione che si desidera si trova in offset 75 MB, quindi non è necessario nulla tra 1 ~ 74.9 MB! Hai letto per niente ma per semplificare il tuo codice. Con mmap, si leggeranno solo i dati effettivamente utilizzati (arrotondato a 4kb, o la dimensione della pagina del sistema operativo, che è in genere 4kb), quindi leggerà solo il primo e il 75esimo MB. Penso che sia molto difficile creare un modo più semplice ed efficace per evitare la lettura del disco rispetto ai file mmaping. E se per qualche motivo hai bisogno dei dati con l'offset 37 MB, puoi semplicemente usarlo! Non è necessario decomprimerlo nuovamente, poiché l'intero file è accessibile in memoria (ovviamente limitato dallo spazio di memoria del processo).
Tutti i file mmap'ed vengono sottoposti a backup da soli, non dal file di scambio, lo swapfile viene creato per concedere dati che non hanno un file di cui eseguire il backup, che di solito è data malloc'ed o dati supportati su un file, ma è stato modificato e [non può/non deve] essere riscritto ad esso prima che il programma comunichi effettivamente al sistema operativo di farlo tramite una chiamata msync.
Attenzione che non è necessario mappare l'intero file nella memoria, è possibile mappare qualsiasi quantità (il secondo arg è "size_t length") a partire da qualsiasi posizione (sesto arg - "off_t offset"), ma a meno che il tuo file è probabilmente enorme, puoi tranquillamente mappare 1 GB di dati senza paura, anche se il sistema contiene solo 64 MB di memoria fisica, ma questo è per la lettura, se hai intenzione di scrivere dovresti essere più prudente e mappare solo il cose di cui hai bisogno.
La mappatura dei file ti aiuterà a semplificare il codice (hai già il contenuto del file in memoria, pronto per l'uso, con un sovraccarico di memoria molto minore dato che non è memoria anonima) e più veloce (leggerai solo i dati che accesso al programma).
Quanto è grande "grande"? Ancora più importante, come si confronta con la RAM reale totale sul computer in cui verrà eseguito? – zwol
Big è di diversi gigabyte. Ho 24G di RAM, quindi alcuni file possono occupare fino a un quarto della RAM fisica o anche di più. – Elektito
Fondamentalmente, usando 'mmap()', stai facendo in modo che quella memoria sia supportata da un file, invece di essere supportata da swap (la cosiddetta memoria anonima). Sotto la pressione della memoria, il kernel può decidere di recuperare la memoria con supporto dei file in modo più aggressivo rispetto alla memoria anonima, o potrebbe fare il contrario, non lo so. – ninjalj