2012-05-24 17 views
8

私は8GBのRAMを持っていますが、Haskellのプログラムは一見1.3GBしか使用できません。Haskellプログラムで使用可能なすべてのRAMを使用していますか?

私は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
  • が実行されています。out of memory error
  • ./mem.exe 42000000 +RTS -s -M3.9Gを実行している10のエラーアウトは、最大メモリ使用量を約1.2ギガバイトであることを示しているout of memory error

は、Windowsのタスクマネージャを介してプロセスを監視して失敗しました。

私のシステム:Win7,8 GB RAM、Haskell Platform 2011.04.0.0、ghc 7.0.4。 ghc -O2 mem.hs -rtsopts

がどのように私は私の使用可能なRAMの全てを利用することができます:

私はしてコンパイルしていますか?私は明白な何かを欠いていますか

+2

最新バージョンのGHCにアップグレードしてください。 Windowsマシンに最大プロセス制限が設定されていますか? GHCにはヒープリミットがないため、OSによってプロセスアドレス空間が制限される可能性があります。 –

+0

ハスケルプラットフォームの快適ゾーンを離れたくない場合は、次のバージョンが今月リリースされる予定であることに注意してください。私が最後にGHC 7.4.1を含めることを確認しました。 – dave4420

答えて

8

現在、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が収まるのに十分な大きさ)、動作するはずです。

+0

あなたの分析のためにありがとう – ErikR

+0

そして、それは '-M1800M'で動作しますか? –

+0

はい、 '-M1800M'で動作します – ErikR

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まで割り当てることができます。私は勝利7であなたがそのような下限を持たないことを想像しています - このテーブルsuggests either 4G or 192G - あなたが必要とするだけ多くのことを頼みます(そして最近のGHCを使用してください)。

関連する問題