在GHC的最新版本,它可以設置每個線程分配櫃檯和限制,使用setAllocationCounter
和enableAllocationLimit
從GHC.Conc
。當限制被設置並且計數器達到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()
分配是有點粗糙的措施,但它仍然是有用的來檢測一些「失控」的計算。
This blog post通過Simon Marlow進行更多細節。
你究竟想限制什麼?爲任意Haskell代碼限制任意內存可能不會成爲可能,但您可以通過將其隱藏在類型類後面來限制對某些特定資源的訪問。 – Cirdec
操作系統進程可能具有有限的內存。一個可能的解決方案是在新進程中分叉一個新進程和['setResourceLimit'](https://hackage.haskell.org/package/unix-2.7.2.1/docs/System-Posix-Resource.html),並且用[Remote](https://hackage.haskell.org/package/remote-0.1.1/docs/Remote.html)等方式與它進行交流。你需要限制在新進程中運行的代碼不如'IO()'強大。 – Cirdec
是的,我試圖限制整個編譯過程的內存使用情況。這些可能非常昂貴,如果我不以某種方式限制堆的使用,我會很容易受到DoS的攻擊。 – paulotorrens