2014-09-25 12 views
14

Sto creando un programma che implementa un qualche tipo di cache. Ho bisogno di usare il più memoria possibile e per farlo ho bisogno di fare due cose:Controllare l'utilizzo della memoria in haskell

  1. Controlla la quantità di memoria è ancora disponibile in di sistema (RAM solo, non swap)
  2. controllare la quantità di memoria mia l'app sta già utilizzando.

Ho bisogno di una soluzione indipendente dalla piattaforma (Linux, Windows, ecc.).

Utilizzando queste due informazioni ridurrò la dimensione della cache o la ingrandirò. Come posso ottenere queste informazioni in Haskell? Ci sono pacchetti che possono fornire tali informazioni?

+1

"Controlla quanta memoria è ancora disponibile nel sistema". Questa domanda non ha molto senso. Hai un file di scambio che può crescere fino a 2 TB. Tutta quella memoria è "disponibile"? Se occupi tutto, il tuo sistema si fermerà. Forse vuoi controllare la memoria fisica. Ma cosa succede se hai 300 schede aperte in un browser che sono tutte intatte per una settimana? Sono pronti per essere scambiati con una goccia di cappello, ma al momento occupano il 99,5% della memoria fisica, quindi non hai niente "disponibile". –

+1

@ n.m. Penso che sia ovvio che per implementare la cache ho bisogno di una quantità di spazio libero che è nella RAM, non in SWAP. Costruire una cache che renderà lo scambio di sistema non è una buona idea. ; p – remdezx

+0

Perché non consentire all'utente di specificare la dimensione della cache? Potrebbero non volere un programma che usi automaticamente tutta la RAM comunque. –

risposta

3

Non riesco a vedere immediatamente come eseguirlo.

Tuttavia, GHC ha "indicatori deboli". (Vedi System.Mem.Weak.) Se crei elementi e ti aggrappi a loro tramite puntatori deboli (solo), quindi il garbage collector inizierà automaticamente a eliminare gli elementi se si esaurisce la memoria fisica.

(Purtroppo, questo non ti dà la possibilità di decidere quali elementi da eliminare prima — ad esempio, quelli che sono più economico per ricreare o quelli che sono stati meno utilizzati o qualcosa del genere.)

+0

Sembra molto interessante! Sfortunatamente, richiederà alcuni cambiamenti di architettura, ma posso considerarlo. Grazie! – remdezx

+0

Potresti anche essere interessato a sapere che 'System.Mem' contiene funzioni per provocare l'esecuzione del GC in un momento specifico (ad esempio, dopo aver smesso di utilizzare un oggetto veramente grande). Non direttamente correlato alla tua domanda, ma potrebbe essere interessante. – MathematicalOrchid

+0

Lo so, li ho trovati mentre stavo scavando più in quell'argomento :) – remdezx

Problemi correlati