2014-09-25 71 views
14

我正在創建一個實現某種緩存的程序。我需要使用盡可能多的內存可能要做到這一點,我需要做兩件事情:檢查haskell中的內存使用情況

  1. 檢查多少內存仍然在系統中可用(RAM只,而不是交換)
  2. 檢查多少內存我應用程序已在使用。

我需要一個獨立於平臺的解決方案(Linux,Windows等)。

使用這兩條信息我會減少緩存的大小或將其擴大。 我如何在Haskell中獲得這些信息?有沒有可以提供這些信息的軟件包?

+1

「檢查系統中還有多少內存可用」。這個問題沒有多少意義。你有一個交換文件,可以增長到2TB。所有的記憶「可用」?如果你佔用這一切,你的系統就會停下來。也許你想檢查物理內存。但是如果你在一個瀏覽器中打開了300個標籤,並且這些標籤都沒有被觸動一週,那該怎麼辦?他們已經準備好換掉一頂帽子,但他們現在佔用了99.5%的物理內存,所以你根本沒有任何「可用」的東西。 – 2014-09-25 10:06:22

+1

@ n.m。我認爲這是很明顯的,爲了實現緩存,我需要大量的可用空間在RAM中,而不是在SWAP中。構建一個可以使系統交換的緩存不是一個好主意。 ; p – remdezx 2014-09-25 10:16:26

+0

爲什麼不讓用戶指定緩存大小?他們可能不想要一個自動使用所有RAM的程序。 – 2014-09-25 17:15:56

回答

3

我不能立即看到如何做到這一點便攜式。

但是,GHC確實有「弱指針」。 (請參閱System.Mem.Weak。)如果您通過弱指針(僅限)創建項目並掛上它們,則垃圾收集器將在物理內存不足時自動開始刪除項目。

(不幸的是,這不會給你來決定要刪除的項目的能力第一—如,是最便宜的重建者或已最少使用或東西的人。)

+0

看起來很有趣!不幸的是,它需要一些體系結構的改變,但我可以考慮它。謝謝! – remdezx 2014-09-25 12:34:43

+0

您可能也有興趣知道'System.Mem'包含一些函數來激發GC在特定時間運行(例如,在您停止使用真正的大對象之後)。與你的問題沒有直接關係,但可能很有趣。 – MathematicalOrchid 2014-09-25 12:37:12

+0

我知道,當我更深入地研究那個話題時,我發現了他們:) – remdezx 2014-09-25 13:11:22