Domanda

Devo conservare quanto più possibile di file di grandi dimensioni nella cache dei blocchi del sistema operativo anche se è più grande di quello che posso inserire in ram, e sto continuando a leggere un altro file molto grande. ATM: rimuoverò un grosso pezzo di file importanti di grandi dimensioni dalla cache di sistema quando eseguo lo streaming da un altro file.

È stato utile?

Soluzione

In un sistema POSIX come Linux o Solaris, prova a utilizzare posix_fadvise.

Sul file di streaming, fai qualcosa del genere:

posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);
while( bytes > 0 ) {
  bytes = pread(fd, buffer, 64 * 1024, current_pos);
  current_pos += 64 * 1024;
  posix_fadvise(fd, 0, current_pos, POSIX_FADV_DONTNEED);
}

E puoi applicare POSIX_FADV_WILLNEED all'altro tuo file, il che dovrebbe aumentare la sua priorità di memoria.

Ora, so che Windows Vista e Server 2008 possono anche fare trucchi eleganti con priorità di memoria. Probabilmente anche versioni precedenti come XP possono fare altri trucchi di base. Ma non conosco le funzioni dalla parte superiore della mia testa e non ho tempo di cercarle.

Altri suggerimenti

All'interno di Linux, è possibile montare un filesystem come tipo tmpfs , che utilizza la memoria di swap disponibile come backup se necessario. Dovresti essere in grado di creare un filesystem maggiore delle dimensioni della tua memoria e dare priorità al contenuto di quel filesystem nella cache di sistema.

mount -t tmpfs none /mnt/point

Vedi: http://lxr.linux.no/linux/Documentation /filesystems/tmpfs.txt

Puoi anche beneficiare dei file swapiness e drop_cache in /proc/sys/vm

Se stai usando Windows, prendi in considerazione l'apertura del file che stai scansionando con il flag

FILE_FLAG_SEQUENTIAL_SCAN

Puoi anche usare

FILE_FLAG_NO_BUFFERING

per quel file, ma impone alcune restrizioni sulla dimensione di lettura e sull'allineamento del buffer.

Alcuni sistemi operativi hanno ramdisk che puoi usare per mettere da parte un segmento di RAM per l'archiviazione e quindi montarlo come file system.

Ciò che non capisco, tuttavia, è il motivo per cui si desidera impedire al sistema operativo di memorizzare nella cache il file. La tua domanda completa non ha davvero senso per me.

Acquista più RAM (è relativamente economico!) o lascia che il sistema operativo faccia la sua cosa. Penso che scoprirai che aggirare il sistema operativo sarà più un problema di quanto valga la pena. Il sistema operativo memorizzerà nella cache tutta la quantità di file necessaria, fino a quando la tua o qualsiasi altra applicazione avrà bisogno di memoria.

Suppongo che potresti ridurre al minimo il numero di processi, ma probabilmente è più veloce acquistare più memoria.

mlock () e mlockall () bloccano rispettivamente parte o tutto lo spazio degli indirizzi virtuali del processo di chiamata nella RAM, impedendo che la memoria venga paginata nell'area di scambio.

(copiato dalla pagina man Linux di MLOCK (2))

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top