利用Haskell程序中的所有可用RAM?

时间:2012-05-24 18:12:08

标签: windows haskell memory-management ghc heap-memory

我有8 GB的RAM,但Haskell程序似乎只能使用1.3 GB。

我正在使用这个简单的程序来确定GHC程序可以分配多少内存:

import System.Environment
import Data.Set as Set

main = do
         args <- getArgs
         let n = (read $ args !! 0) :: Int
             s = Set.fromList [0..n]
         do
           putStrLn $ "min: " ++ (show $ findMin s)
           putStrLn $ "max: " ++ (show $ findMax s)

以下是我的发现:

  • 正在运行./mem.exe 40000000 +RTS -s并报告1113 MB total memory in use
  • 正在运行./mem.exe 42000000 +RTS -s失败并显示out of memory error
  • 使用./mem.exe 42000000 +RTS -s -M4G
  • 运行-M4G: size outside allowed range错误
  • 正在运行./mem.exe 42000000 +RTS -s -M3.9G失败并显示out of memory error

通过Windows任务管理器监控进程显示最大内存使用量约为1.2 GB。

我的系统:Win7,8 GB RAM,Haskell平台2011.04.0.0,ghc 7.0.4。

我正在编译:{{1​​}}

如何利用我所有可用的内存?我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:8)

目前,在Windows上,GHC是一个32位GHC - 我认为当7.6到来时,Windows的64位GHC应该可用。

其中一个结果是,在Windows上,您不能使用超过4G - 1BLOCK的内存,因为作为size参数允许的最大值为HS_WORD_MAX

decodeSize(rts_argv[arg], 2, BLOCK_SIZE, HS_WORD_MAX) / BLOCK_SIZE;

使用32位字,HS_WORD_MAX = 2^32-1

解释

  

使用-M4G运行./mem.exe 42000000 + RTS -s -M4G错误:大小超出允许范围

因为decodeSize()4G解码为2^32

升级GHC后,此限制也将保留,直到最终发布64位GHC for Windows。

作为32位进程,用户模式虚拟地址空间限制为2或4 GB(取决于IMAGE_FILE_LARGE_ADDRESS_AWARE标志的状态),cf Memory limits for Windows Releases

现在,您正在尝试构建一个包含4200万个4字节Set的{​​{1}}。 Int每个元素有五个字的开销(构造函数,大小,左右子树指针,指向元素的指针),因此Data.Set.Set将占用大约0.94 GiB的内存(1.008'metric'GB )。但是该进程使用大约两倍或更多(它需要垃圾收集的空间,至少是活动堆的大小)。

在我的64位linux上运行程序,输入21000000(以弥补两倍大Set和指针),我得

Int

$ ./mem +RTS -s -RTS 21000000 min: 0 max: 21000000 31,330,814,200 bytes allocated in the heap 4,708,535,032 bytes copied during GC 1,157,426,280 bytes maximum residency (12 sample(s)) 13,669,312 bytes maximum slop 2261 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 59971 colls, 0 par 2.73s 2.73s 0.0000s 0.0003s Gen 1 12 colls, 0 par 3.31s 10.38s 0.8654s 8.8131s INIT time 0.00s ( 0.00s elapsed) MUT time 12.12s ( 13.33s elapsed) GC time 6.03s ( 13.12s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 18.15s ( 26.45s elapsed) %GC time 33.2% (49.6% elapsed) Alloc rate 2,584,429,494 bytes per MUT second Productivity 66.8% of total user, 45.8% of total elapsed 仅报告内存使用top - 1.1g,并且可能是任务管理器,仅报告实时堆。

所以似乎top未设置,您的进程仅限于2GB的地址空间,而且4200万IMAGE_FILE_LARGE_ADDRESS_AWARE需要更多 - 除非您指定最大或建议的堆大小更小:

Set

将最大堆大小设置为低于它自然使用的大小,实际上让它适合于$ ./mem +RTS -s -M1800M -RTS 21000000 min: 0 max: 21000000 31,330,814,200 bytes allocated in the heap 3,551,201,872 bytes copied during GC 1,157,426,280 bytes maximum residency (12 sample(s)) 13,669,312 bytes maximum slop 1154 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 59971 colls, 0 par 2.70s 2.70s 0.0000s 0.0002s Gen 1 12 colls, 0 par 4.23s 4.85s 0.4043s 3.3144s INIT time 0.00s ( 0.00s elapsed) MUT time 11.99s ( 12.00s elapsed) GC time 6.93s ( 7.55s elapsed) EXIT time 0.00s ( 0.00s elapsed) Total time 18.93s ( 19.56s elapsed) %GC time 36.6% (38.6% elapsed) Alloc rate 2,611,793,025 bytes per MUT second Productivity 63.4% of total user, 61.3% of total elapsed 所需的空间,只需要稍长的GC时间,并建议堆大小Set让它仅使用

完成
-H1800M

因此,如果您指定最大堆大小低于2GB(但足够大以使1831 MB total memory in use (0 MB lost due to fragmentation) 适合),它应该可以工作。

答案 1 :(得分:4)

default heap size is unlimited

在64位Windows XP计算机上使用GHC 7.2,我可以通过明确设置更大的堆大小来分配更高的值:

$ ./A 42000000  +RTS -s -H1.6G
min: 0
max: 42000000
  32,590,763,756 bytes allocated in the heap
   3,347,044,008 bytes copied during GC
     714,186,476 bytes maximum residency (4 sample(s))
       3,285,676 bytes maximum slop
            1651 MB total memory in use (0 MB lost due to fragmentation)

$ ./A 42000000  +RTS -s -H1.7G
min: 0
max: 42000000
  32,590,763,756 bytes allocated in the heap
   3,399,477,240 bytes copied during GC
     757,603,572 bytes maximum residency (4 sample(s))
       3,281,580 bytes maximum slop
            1754 MB total memory in use (0 MB lost due to fragmentation)

甚至:

$ ./A 42000000  +RTS -s -H1.85G
min: 0
max: 42000000
  32,590,763,784 bytes allocated in the heap
   3,492,115,128 bytes copied during GC
     821,240,344 bytes maximum residency (4 sample(s))
       3,285,676 bytes maximum slop
            1909 MB total memory in use (0 MB lost due to fragmentation)

也就是说,我可以分配到Windows XP 2G process limit。我想在Win 7上你不会有这么低的限制 - 这个表suggests either 4G or 192G - 只需要你所需要的(并使用更新的GHC)。