目前,在Windows上,GHC是32比特的GHC——我想在7.6到来时,应该有64比特的窗口GHC。
其后果之一是,在 Windows 上,您无法使用超过 4G - 1BLOCK
的内存,因为大小参数允许的最大值为 HS_WORD_MAX
:
decodeSize(rts_argv[arg], 2, BLOCK_SIZE, HS_WORD_MAX) / BLOCK_SIZE;
有32位字, HS_WORD_MAX = 232-1
。
这就是为什么
运行./mem.exe 42000000 +RTS -s -M4G 错误与 -M4G: 超出允许范围的大小
自 decodeSize ()
decodesesion () 4G
改为 232
。
这一限制在提升你的GHC后也将保持不变,直到最终释放出用于Windows的64位GHC。
作为32比特程序,用户模式虚拟地址空间限为2或4GB(取决于 IMAGE_FILE_LARGE_ADIDES_AWARE
旗的状况),参考 Windows 释放的记忆限制 。
现在,您正在试图构建一个 set
, 包含4 200万个4字节 < Int
>。 一个 Data.Set.Set
每个元素有五个管理方字( 构件、 大小、 左和右下树下指针、 指针到元素), 因此, et < /code > 将占用约0. 94 GiB 的内存( 1.008 公吨 GB) 。 但这一过程使用大约两倍或更多( 它需要收集垃圾的空间, 至少是活堆的大小 ) 。
在我的 64 位/ 位 Linux 上运行程序, 输入 21000000 输入( 弥补两倍大的 < code> Int code> 和指针), 我得到
$ ./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
仅报告内存使用的 >>top
< codeg - top
- -
- - - - - - - top
- - - - 可能的任务管理器只报告实时堆积。
似乎 IMAGE_FILE_LARGE_ADERES_AWARE
尚未设定,您的程序仅限于2GB的地址空间,4 200万个 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
设定低于其自然使用值的最大堆积大小, 实际让其与 set
所需的空间相比, 价格略长一点的GC时间, 并且建议一个 - H1800M
的堆积大小, 让它只用完成
1831 MB total memory in use (0 MB lost due to fragmentation)
因此,如果您指定了低于2GB(但大到足以适合 Set
)的最大堆积大小,应该有效。