現在、Windowsでは、GHCは32ビットGHCです。私は、Windows用の64ビットGHCは、7.6が来ると利用できると考えています。
ことの1つの結果は、サイズのパラメータとして許容される最大のHS_WORD_MAX
あるので、Windows上で、あなたは、以上のメモリ4G - 1BLOCK
を使用することができないということです:32ビットの言葉で
decodeSize(rts_argv[arg], 2, BLOCK_SIZE, HS_WORD_MAX)/BLOCK_SIZE;
、HS_WORD_MAX = 2^32-1
。 ./memを実行している
を説明
。EXE 42000000 + RTSは-M4Gと-M4G誤差を-s:サイズ外許容範囲2^32
として4G
復号
decodeSize()
ため。
この制限は、GHCのアップグレード後も、最終的に64ビット版のGHC for Windowsがリリースされるまで維持されます。
32ビットプロセスでは、ユーザモードの仮想アドレス空間は、IMAGE_FILE_LARGE_ADDRESS_AWARE
フラグのステータスに応じて、2 GBまたは4 GB(cf:Memory limits for Windows Releases)に制限されています。
今度は、4200万の4バイトのInt
を含むSet
を作成しようとしています。 Data.Set.Set
は、要素(コンストラクタ、サイズ、左右のサブツリーポインタ、要素へのポインタ)ごとに5ワードのオーバーヘッドを持つため、Set
は約0.94 GiB(1.008メトリック)のメモリを占有します。しかし、プロセスは約2倍以上を使用します(ガベージコレクションのためのスペース、少なくともライブヒープのサイズが必要です)。
のみ1.1g
メモリの入力2100万(2倍の大き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
レポートを取得、私の64ビットのLinux上でプログラムを実行しますtop
を使用し、おそらくタスクマネージャーはライブヒープのみを報告します。
だから、IMAGE_FILE_LARGE_ADDRESS_AWARE
が設定されていない、あなたのプロセスはそれ以上を必要とするSet
2ギガバイトのアドレス空間、および4200万に制限されているようです - あなたは小さい最大値または示唆したヒープサイズを指定しない限り:
$ ./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
が収まるのに十分な大きさ)、動作するはずです。
最新バージョンのGHCにアップグレードしてください。 Windowsマシンに最大プロセス制限が設定されていますか? GHCにはヒープリミットがないため、OSによってプロセスアドレス空間が制限される可能性があります。 –
ハスケルプラットフォームの快適ゾーンを離れたくない場合は、次のバージョンが今月リリースされる予定であることに注意してください。私が最後にGHC 7.4.1を含めることを確認しました。 – dave4420