8

私は8GBのRAMを持っていますが、Haskellプログラムは1.3GBしか使用できないようです。

この単純なプログラムを使用して、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.2GBであることがわかります。

私のシステム:Win7、8 GB RAM、Haskell Platform 2011.04.0.0、ghc7.0.4。

私はコンパイルしています:ghc -O2 mem.hs -rtsopts

使用可能なすべてのRAMをどのように利用できますか?明らかな何かが欠けていますか?

4

2 に答える 2

8

現在、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()デコードするので。4G2^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.1gtop

したがって、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

最大ヒープサイズを自然に使用するサイズよりも小さく設定すると、実際には、必要なスペースをほとんど超えないようになりますが、SetGC時間はわずかに長くなります。また、ヒープサイズを提案すると、-H1800M使用を終了できるようになります。

1831 MB total memory in use (0 MB lost due to fragmentation)

したがって、最大ヒープサイズを2GB未満(ただし、Set収まるのに十分な大きさ)に指定すると、機能するはずです。

于 2012-05-24T21:21:25.820 に答える
4

デフォルトのヒープサイズは無制限です。

64ビットのWindowsXPマシンでGHC7.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)

つまり、WindowsXP2Gのプロセス制限まで割り当てることができます。Win 7では、このような下限はないだろうと思います。この表は、4Gまたは192Gのいずれかを示しています。必要なだけ要求してください(そして、より新しいGHCを使用してください)。

于 2012-05-24T18:26:38.820 に答える