2010-02-03 11 views
6

Il mio ambiente è XP a 32 bit. Trovo che quando la memoria allocata è quasi la dimensione massima, 2 GB, significa che è disponibile un piccolo spazio virtuale, allocazione nuova memoria è molto lenta.Qual è più veloce, legge dal disco o alloca memoria di sistema

Quindi se ho un file di paging, la mia app deve analizzarli. Ho due modi. Uno è leggerli tutti nella memoria di sistema, quindi fare l'analisi. L'altro è di riservare prima un buffer di memoria come cache e leggere parte del file di pagina in quel buffer, analizzare e quindi scartare, quindi leggere la seconda parte del file di paging e scavalcare la cache, ripetere l'analisi.

Dal profilo, sembra che il secondo sia più veloce, poiché evita il costo del tempo di allocazione.

Cosa ne pensi? Grazie in anticipo.

+1

+1 per la creazione profili! – Justin

risposta

5

(1) Non sono sicuro che la domanda corrisponda al titolo. Se stai allocando vicino a 2 GB di RAM su Windows a 32 bit, il sistema probabilmente sta pagando molta memoria su disco, ed è qui che guarderei prima per il rallentamento. Quando si utilizza molta memoria, si dovrebbe considerare come memorizzato come su disco (in pagefile.sys) ma nella cache fisica nella cache fisica. Il secondo potrebbe essere più veloce non a causa del costo di allocazione, ma a causa del costo dell'utilizzo di molta memoria in una volta. In effetti, quando copi il file in una grande allocazione, ne copi gran parte disco-> disco via RAM, quindi quando lo esegui nuovamente per analizzarlo, stai caricando di nuovo la copia in RAM. Se la tua analisi è un algoritmo a passaggio singolo, c'è un sacco di lavoro ridondante.

(2) Quello che penso è, mmap il file (MapViewOfFile e amici su Windows).

Modifica: (3) un avvertimento. Se il file è attualmente 1.8GB, potrebbe esserci la possibilità che l'anno prossimo potrebbe essere 4GB. Se è così, mi piacerebbe ora che avesse una dimensione maggiore di 2^32 su una macchina a 32 bit, il che significa o prendere la seconda opzione, oppure usare ancora MapViewOfFile ma farlo diventare una porzione sensibile del file ad una tempo, piuttosto che tutto in una volta. Altrimenti rivedrai questo codice la prima volta che qualcuno lo prova su un grosso file e segnala il bug.

+0

Grazie. È interessante. Ma ho 4 GB di RAM. Dal task manager, la RAM fisica disponibile è libera da 1,6 GB. Questo significa comunque che un sacco di buffer verrà inserito nel file di pagina sys quando l'allocazione è vicina a 2 GB? – Buzz

+0

L'allocazione del buffer potrebbe fallire molto prima che la RAM si esaurisca. La domanda è se si sta eseguendo un Windows a 64 bit. Ciò ti consente di utilizzare> 2 GB _RAM per processo_. – MSalters

+1

@MSalters: l'interrogante non sta eseguendo Windows a 64 bit. @Buzz: penseresti che Windows non rileverà lo swap (per i programmi non idle) prima che tutta la RAM sia in uso, ma non sembra funzionare in questo modo. È possibile che nel tuo caso non ci sia scambio, ma se provassi a spiegare appieno la differenza di prestazioni tra le tue due opzioni, vorrei escluderla - come il controllo più semplice, assicurati che l'uso del file di pagina non aumenti mentre il programma è in esecuzione. Successivamente, sarebbe opportuno esaminare i problemi di cache caching. Ma come ho detto, mapperei il file e se è il più veloce a chi importa degli altri? ;-) –

5

Si dimentica modo 3d - per mappare la memoria su file, vedere la funzione CreateFileMapping/MapViewOfFile Questo è il modo più veloce

+0

È il contrario. Il file è mappato nello spazio degli indirizzi del processo. – Void

0

Perché l'importo assegnato di memoria così in alto? Se le allocazioni di memoria impiegano una quantità ragionevole di tempo, troverai che farlo in memoria è molto più veloce - il mio approccio sarebbe farlo in memoria, e cercare di trovare un modo per ridurre l'utilizzo della memoria al punto in cui è di nuovo veloce .

1

La soluzione migliore è utilizzare Windows MapViewOfFile e funzioni simili (l'equivalente di Windows di mmap). Ciò consentirà al sistema operativo di gestire il paging in varie parti del file.

+0

Ma se ho più file di grandi dimensioni (1,8 GB), va bene? – Buzz

+0

Il sistema operativo mapperà l'intero file nella memoria del processo, ma caricherà solo i bit del file che si sta guardando in RAM.Questo è esattamente il modo in cui il sistema operativo gestisce il suo spazio di swap su disco. – doron

+2

@Buzz: non è possibile mappare l'insieme di più file da 1,8 GB nello stesso processo a 32 bit contemporaneamente, poiché lo spazio virtuale deve essere assegnato anche se la memoria fisica viene impegnata solo se necessario. File diversi in processi diversi dovrebbero essere OK per quanto ne so, e puoi sempre mappare il file in blocchi (nello stesso modo in cui la tua seconda opzione legge blocchi, ma mappando blocchi più grandi). –

0

Come vedo la situazione, è possibile gestire personalmente il paging o lasciare che il sistema operativo gestisca il cercapersone. Nella maggior parte dei casi suggerisco di lasciare che il sistema operativo gestisca il paging (usa la memoria virtuale). Dal momento che ho una sfiducia nei sistemi operativi MS, non posso raccomandare questa tecnica, anche se il tuo chilometraggio può variare.

Problemi correlati