現在、Windowsでは、GHCは32ビットGHCです。7.6が登場すると、Windows用の64ビットGHCが利用可能になると思います。
その結果の1つは、Windowsでは4G - 1BLOCK
、サイズパラメータとして許可される最大値が次のとおりであるため、メモリをHS_WORD_MAX
多く使用することはできないということです。
decodeSize(rts_argv[arg], 2, BLOCK_SIZE, HS_WORD_MAX) / BLOCK_SIZE;
32ビットワードの場合、HS_WORD_MAX = 2^32-1
。
それは説明します
実行中./mem.exe42000000+ RTS -s -M4Gエラーが-M4Gで発生:サイズが許容範囲外
としてdecodeSize()
デコードするので。4G
2^32
この制限は、GHCをアップグレードした後も、最終的に64ビットGHCforWindowsがリリースされるまで続きます。
32ビットプロセスとして、ユーザーモードの仮想アドレス空間は2GBまたは4GBに制限されています(IMAGE_FILE_LARGE_ADDRESS_AWARE
フラグのステータスによって異なります)。Windowsリリースのメモリ制限を参照してください。
Set
今、あなたは4200万の4バイトを含むものを構築しようとしていますInt
。AData.Set.Set
には要素ごとに5ワードのオーバーヘッド(コンストラクター、サイズ、左右のサブツリーポインター、要素へのポインター)があるため、Set
は約0.94 GiBのメモリ(1.008'メートル法'GB)を占有します。ただし、プロセスはその約2倍以上を使用します(ガベージコレクション用のスペース、少なくともライブヒープのサイズが必要です)。
Int
入力21000000(2倍の大きさのsとポインターを補うため)を使用して64ビットLinuxでプログラムを実行すると、次のようになります。
$ ./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
したがって、IMAGE_FILE_LARGE_ADDRESS_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
収まるのに十分な大きさ)に指定すると、機能するはずです。