2014-09-25 79 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