2014-09-25 23 views
14

Bir çeşit önbellek uygulayan bir program yapıyorum. Ben mümkün olduğunca fazla bellek kullanmasına ve iki şey yapmak gerekir bunu yapmak zorunda: kadar bellek hala sistemde kullanılabilir nasıl (RAM sadece TAKAS değil)haskell'de bellek kullanımını kontrol edin

  1. Kontrol
  2. Kontrolü ne kadar bellek benim uygulama zaten kullanıyor.

Platform bağımsız bir çözüme (Linux, Windows, vb.) Ihtiyacım var.

Bu iki bilgi parçasını kullanarak, önbellek boyutunu azaltacağım veya büyüteceğim. Bu bilgiyi Haskell'de nasıl edinebilirim? Bu bilgiyi sağlayabilecek paketler var mı?

+1

"Sistemde ne kadar bellek olduğunu kontrol edin". Bu sorunun pek bir anlamı yok. 2TB'ye kadar büyüyebilen bir takas dosyanız var. Bütün bu hafıza "müsait" mi? Hepsini işgal ederseniz, sisteminiz durur. Belki fiziksel hafızayı kontrol etmek istersiniz. Ancak, bir hafta boyunca tüm dokunulmamış bir tarayıcıda 300 sekme açıyorsanız ne olur? Bir şapka damlasıyla değiştirilmeye hazırlar, ancak şu anda fiziksel belleğin% 99.5'ini işgal ediyorlar, yani "müsait" bir şey yok. –

+1

@ n.m. Önbellek uygulamak için SWAP'ta değil, RAM'de bulunan boş alan miktarına ihtiyacım olduğunu düşünüyorum. Sistem değiştirmeyi yapacak bir önbellek oluşturmak iyi bir fikir değildir. ; p – remdezx

+0

Kullanıcı neden önbellek boyutunu belirlemeli? Zaten tüm RAM'i otomatik olarak kullanan bir program istemeyebilirler. –

cevap

3

Bunu doğrudan nasıl yapacağımı hemen göremiyorum. Bununla birlikte, GHC'nin "zayıf işaretçileri" vardır. (Bkz. System.Mem.Weak.) Öğeleri oluşturursanız ve bunlara zayıf göstergelerle (yalnızca) bağlarsanız, çöp toplayıcı, fiziksel belleği düşük çalıştırırsanız, öğeleri otomatik olarak silmeye başlar.

(Maalesef bu size silmek hangi öğeleri karar verme yeteneğine vermez ilk — örneğin yeniden ucuz olanlar veya en az kullanılan ya da bir şey edilmiş olanlardır.)

+0

Çok ilginç görünüyor! Ne yazık ki, bazı mimari değişimleri gerektirecektir, ancak bunu düşünebilirim. Teşekkürler! – remdezx

+0

Ayrıca, System.Mem'in GC'yi belirli bir zamanda çalışmasını tetikleyen işlevler içerdiğini (örneğin, gerçekten büyük bir nesneyi kullanmayı bıraktıktan sonra) bilmeniz de ilginizi çekebilir. Sorunuzla doğrudan alakalı değil, ancak ilginç olabilir. – MathematicalOrchid

+0

Biliyorum, onları bu konuya daha çok kazarken buldum :) – remdezx

İlgili konular