我可以在Haskell中限制每个功能/单元/线程的内存使用量



我正在研究一个旨在作为服务的研究编译器项目。一个要求之一是,某些用户在处理呼叫时,某些用户的内存使用情况可能有限(例如," IP a.b.c.d 的调用最多可能会使用30MB的堆内存")。

我的原型实现(用C编写)只是直接使用malloc'IND的内存池(由于有效的类型,实际上很难获得正确的选择)。不过,手动内存管理。

是否有任何方法可以通过限制函数,单元或轻质线程来实现这一目标?(我会接受其他功能性语言的建议,这可能会让我这样做。)

在GHC的最新版本中,可以使用GHC.Conc中的setAllocationCounterenableAllocationLimit设置每线程分配计数器和限制。设置限制并且计数器达到0时,线程会收到异步异常。

计数器测量分配,而不是实时设置的大小。例如,尽管该代码的实时设置从未变得很大,但该代码达到了极限:

{-# LANGUAGE NumDecimals #-}
module Main where
import Data.Foldable (for_)
import System.IO
import GHC.Conc (setAllocationCounter,enableAllocationLimit)
main :: IO ()
main = 
  do setAllocationCounter 2e9
     enableAllocationLimit
     let writeToHandle h =
            for_ ([1..]::[Integer])
                 (hPutStrLn h . show)
     withFile "/dev/null" WriteMode writeToHandle
     return ()

分配作为一种措施有点粗糙,但是检测一些"失控"计算仍然很有用。

Simon Marlow的这篇博客文章更详细。

最新更新