2012-02-21 10 views
3

私はこれを決して言わないと思った。マシンを超低速で動作させたいです。RAMに収まらない単一の配列を割り当てる方法

これは私がこれを行う方法です: 私はF#(Array.init)で1つの大きな配列を割り当てたいと思います。それは、アレイへのランダムアクセスがページフォールトを生成するほど大きくなければならない。私は4GBのRAMを持っており、64ビットモードで動作しています。 2^29の4バイト整数を割り当てると、ランタイムはメモリ不足の例外をスローします。

> Array.init (1 <<< 28) (fun i->i);; 
val it : int [] = 
    [|0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 
    21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 34; 35; 36; 37; 38; 39; 
    40; 41; 42; 43; 44; 45; 46; 47; 48; 49; 50; 51; 52; 53; 54; 55; 56; 57; 58; 
    59; 60; 61; 62; 63; 64; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 75; 76; 77; 
    78; 79; 80; 81; 82; 83; 84; 85; 86; 87; 88; 89; 90; 91; 92; 93; 94; 95; 96; 
    97; 98; 99; ...|] 
> Array.init (1 <<< 29) (fun i->i);; 
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
    at <StartupCode$FSI_0003>[email protected]() 
Stopped due to error 
> 
+0

どんな賢明なOSであれ、これらのアレイをかなり素早くディスクに書き出します。あなたが本当にこれをしたいのであれば、C言語でははるかに簡単で、1GBのRAMを使用する100個のF#プロセスを実行するだけです。 –

+0

これは学問だから、私はF#の筋肉を曲げています。私は避けることができるCを避けたいと思います。 – GregC

+0

@JohnPalmerあなたは、C言語ではできるが、CLRでは全く実行できない大規模配列のようなものがあると言っていますか? LukeHが指摘しているように – GregC

答えて

4

32ビットまたは64ビットプラットフォームで実行しているかどうかにかかわらず、Microsoft CLRが1つのオブジェクトに対して許可する最大サイズは2GBです。

2**29の整数の配列を割り当てようとすると、このハードな制限値に対して実行されています。 (配列のデータは正確に2GBですが、ハウスキーピングなどのためにオブジェクトも2バイト以上必要です)

小さな配列を割り当てると、オーバーヘッドが余分にかかることがあります。どれくらい小さくする必要があるか正確には覚えていません。(2**29)-3整数、(2**29)-4整数、(2**29)-5整数などを使ったいくつかの実験は、すばやく教えてください。

+0

http:// stackoverflowという異なるヒープを持つようにすることです。 com/questions/1087982/single-objects-still-limited-to-2-gb-in-size-in-clr-4-0 – GregC

関連する問題