【问题标题】:Check memory usage in haskell检查haskell中的内存使用情况
【发布时间】:2014-09-25 09:48:44
【问题描述】:

我正在创建一个实现某种缓存的程序。我需要使用尽可能多的内存,为此我需要做两件事:

  1. 检查系统中仍有多少可用内存(仅限 RAM,而非 SWAP)
  2. 检查我的应用已经使用了多少内存。

我需要一个独立于平台的解决方案(Linux、Windows 等)。

使用这两条信息,我将减小或放大缓存的大小。 如何在 Haskell 中获取这些信息?有没有可以提供这些信息的软件包?

【问题讨论】:

  • "检查系统中还有多少内存可用"。这个问题没有多大意义。您有一个可以增长到 2TB 的交换文件。所有这些内存都“可用”吗?如果你把它全部占用,你的系统就会停止运转。也许您想检查物理内存。但是,如果您在浏览器中打开了 300 个标签,而这些标签都在一周内未动过呢?它们随时可以被换掉,但它们现在占用了 99.5% 的物理内存,所以你根本没有“可用”的东西。
  • @n.m.我认为很明显,要实现缓存,我需要 RAM 中的可用空间量,而不是 SWAP 中的可用空间。构建一个可以进行系统交换的缓存并不是一个好主意。 ;p
  • 为什么不让用户指定缓存大小呢?他们可能不想要一个自动使用所有 RAM 的程序。
  • @remdezx 我同意这里的 n-m。在我的机器(Mac)上,你可能一直得到零或几乎为零的可用 RAM。我已经好几周没有关闭它了,也好几个月没有关闭应用程序(如果我重新启动,mac 重新加载,登录时,所有在我注销/关闭时打开的应用程序)。所有 8GB 的​​内存总是被完全使用(特别是如果你包括磁盘缓存)。内存按需分配/释放。延迟(非活动)应用程序使用的内存首先被压缩,然后最终按需交换。只需使用合理的尺寸(也许可以配置)。
  • 扩展@AnalogFile 评论:OS X 的 RAM 分为空闲、有线、活动和非活动内存。详情在这里:support.apple.com/kb/ht1342。短版:free 是免费的,inactive 是没有尽可能长时间删除的剩余部分(为了更快地启动应用程序),active 由当前正在运行的程序使用,wired 是 OS X 保留的。

标签: haskell caching memory memory-management resources


【解决方案1】:

我无法立即看到如何以便携方式执行此操作。

但是,GHC 确实有“弱指针”。 (请参阅System.Mem.Weak。)如果您创建项目并通过弱指针(仅)挂在它们上,那么如果您的物理内存不足,垃圾收集器将自动开始删除项目。

(不幸的是,这并不能让您决定首先删除哪些项——例如,重新创建最便宜的项或最少使用的项等。 )

【讨论】:

  • 看起来很有趣!不幸的是,这将需要一些架构更改,但我可以考虑。谢谢!
  • 您可能还想知道System.Mem 包含触发 GC 在特定时间运行的函数(例如,在您刚刚停止使用非常大的对象之后)。与您的问题没有直接关系,但可能很有趣。
  • 我知道,我在深入研究该主题时发现了它们 :)
  • 我认为这不会很好。首先,垃圾收集器将释放不再在其他地方引用的项目。他们不会只是闲逛。您必须完全禁用自动 GC,这甚至是不可能的(而且肯定会很痛苦)。其次,GHC RTS 不会将分配的内存返回给系统,因此即使在项目被释放后,进程也会挂在 RAM 上。它可能会被分页,但考虑到 GHC 使用块的方式,我预计该过程会开始颠簸。
猜你喜欢
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多