如何分配不适合RAM的单个数组

时间:2012-02-21 02:36:26

标签: arrays f# virtual-memory pagefile

我以为我永远不会这么说。我想让我的机器运行速度超慢。

以下是我希望这样做的方式: 我想在F#(Array.init)中分配一个大型数组。它应该是如此之大,以至于随机访问数组会产生页面错误。我有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>.$FSI_0003.main@()
Stopped due to error
> 

1 个答案:

答案 0 :(得分:4)

无论您是在32位还是64位平台上运行,Microsoft CLR对单个对象所允许的最大大小为2GB。

当您尝试分配2**29整数数组时,您正在遇到此硬限制。 (数组的数据正好是2GB,但对象也需要一些额外的字节用于管理等,推动你超过2GB。)

尝试分配稍微较小的数组,以允许额外的几个字节的开销。我不记得究竟要小得多 - 用(2**29)-3整数,(2**29)-4整数,(2**29)-5整数等进行的一些实验应该很快告诉你。