Utilizzare NIO con ogni thread che crea la propria mappatura e legge i dati nel proprio buffer privato. Mantenere la dimensione del buffer privato ottimale. Il sistema operativo legge il file nella sua cache di file nelle pagine e le pagine vengono lette nei buffer privati. Se le stesse regioni vengono lette da più thread, i dati verrebbero letti dalle stesse pagine nella cache dei file, salvando alcuni cicli di i/o di file. Di seguito è riportato un piccolo diagramma per indicare questo. Spero che aiuti a capire meglio.
Con riferimento allo schema sopra, sotto è una spiegazione. Una regione del file è mappata alla memoria. La creazione di una mappatura è solo un segno logico per dire che vuoi leggere da una particolare porzione di un file. Una volta creata la mappatura, la regione mappata è pronta per essere letta. Quando inizi a leggere, il sistema operativo recupera i dati del file nelle sue pagine nella cache dei file. La regione potrebbe essere associata a una o più pagine. Ora leggi le pagine nel tuo buffer privato (più pagine alla volta per ottimizzare). Qualche altro thread potrebbe leggere la stessa regione del primo, quindi legge anche le stesse pagine nel suo buffer privato. Si noti che questa volta la lettura avviene dalla cache dei file senza errori di pagina. Dopo aver elaborato il buffer privato, si richiede di leggere ulteriormente. Nota che stai leggendo una porzione del tuo mapping nel tuo buffer privato alla volta. Il tuo file potrebbe essere 100 MB e mappare una porzione da 10 MB in memoria; e tu hai un buffer privato di 40KB e prima leggi 40KB su 10MB. Quindi richiedi i prossimi 40 KB e così via. Il sistema operativo verifica se i dati che vuoi leggere sono già scaricati nella cache. In caso contrario, si verifica un errore di pagina e il sistema operativo recupera i dati richiesti nelle pagine. Anche in questo caso questi dati possono essere condivisi se più richieste di thread leggono la stessa regione. Puoi benissimo usare la cache dei file per leggere invece di creare il tuo buffer privato. Ma questo può portare a più errori di pagina se il file viene letto simultaneamente più volte su più regioni. Quindi in questo caso è meglio avere un buffer privato di dimensioni ottimali.
Se tutti stanno leggendo e nessuno sta scrivendo, non è necessaria la sincronizzazione. – EJP
@EJP ci sarà un thread da scrivere, tutti gli altri thread letti, preferisco usare ReadWriteLock su byte [] per farlo ora. –
Grazie, ma, con rispetto, la tua domanda non menziona gli scrittori. Cambia completamente l'immagine. Ti suggerisco di modificare questo fatto critico nella tua domanda. – EJP