2015-10-07 18 views
5

Ho un'applicazione in cui sto elaborando un file puramente sequenzialmente in Java. Il file viene aperto, letto una volta e poi chiuso.C'è qualche vantaggio nell'utilizzo della mappatura della memoria per un file ad accesso sequenziale?

Attualmente utilizzo solo un canale file. C'è un'opzione per la memoria mappare il file. Ci sarebbe qualche vantaggio nel fare questo?

+0

Probabilmente no.MMapping aiuta con l'accesso casuale. Hai provato e misurato un beneficio? – zapl

+0

@zapl Preferirei avere un'opinione di esperti su questa particolare domanda rispetto ai test empirici, perché le interazioni del SO per la mappatura della memoria sono complesse e non sono abbastanza esperto per comprendere le diverse ramificazioni. Inoltre, diversi SO possono funzionare diversamente. Fondamentalmente spero che qualcuno esperto nella zona fornisca una risposta autorevole. –

+0

http://stackoverflow.com/questions/45972/mmap-vs-reading-blocks copre alcuni degli aspetti più teorici. I canali dovrebbero essere letti da quando si copia in userspace. Il file diretto alla copia del file potrebbe sfruttare DMA ed evitare l'uso di spazi esterni – zapl

risposta

0

Questa domanda deve fare qualcosa con il livello hardware.

Non vi è alcun vantaggio se il file viene elaborato in modo sequenziale. Se il file viene elaborato dalla mappatura, vi è uno spreco extra di memoria allocando memoria ad alcune altre funzioni (variabili ecc.) Rispetto all'elaborazione sequenziale. Il ruolo della gestione della memoria è fatto da un principio chiamato,

principio di località

programmi tendono ad riutilizzare i dati e le istruzioni che sono vicini gli uni agli altri o hanno utilizzato di recente

  1. temporale Località

    • articoli si fa riferimento Recentemente sono probabilmente fare riferimento in un prossimo futuro
    • Un blocco tendono ad accedere più volte
  2. località spaziale

    • Articoli con un indirizzo nelle vicinanze tendono ad essere riferimento ravvicinati nel tempo
    • Vicino ai blocchi è possibile accedere

lasciate che vi dia un esempio,

sum = 0; 
int array[] = new int[10]; 
for (int i = 0; i < array.length; i++){ 
    sum += array[i]; 
} 

dati

  • elementi dell'array Accesso a sequenziale - località spaziale
  • Riferimento somma ogni iterazione - località temporale

Instructi ons istruzioni

  • Riferimento sequenziale - località spaziale
  • ciclo attraverso l'anello più volte - località temporale

Torna a mettere in discussione, dal momento che i dati nel file sono scritti in modo ordinato nella memoria (come un array) non vi è alcun vantaggio della mappatura perché questa viene trasportata nel modo di localizzazione spaziale come ho descritto in precedenza.