Как выделить один массив, который не помещается в оперативной памяти - PullRequest
3 голосов
/ 21 февраля 2012

Я думал, что никогда не скажу этого.Я хотел бы, чтобы моя машина работала очень медленно.

Вот способ, которым я хотел бы сделать это: я хотел бы выделить один большой массив в F # (Array.init).Он должен быть настолько большим, чтобы при случайном доступе к массиву возникали сбои страниц.У меня 4 ГБ ОЗУ и работает в 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 Ответ

4 голосов
/ 21 февраля 2012

Максимальный размер, разрешенный Microsoft CLR для одного объекта, составляет 2 ГБ, независимо от того, работаете ли вы на 32-разрядной или 64-разрядной платформе.

Вы сталкиваетесь с этим труднымпредел при попытке выделить массив 2**29 целых чисел.(Данные массива должны быть ровно 2 ГБ, но объектам также требуется несколько дополнительных байтов для служебной деятельности и т. Д., Что требует более 2 ГБ.)

Попробуйте выделить немного меньший массив, чтобы учесть этинесколько байтов заголовка.Я не могу точно вспомнить, насколько она должна быть меньше - несколько экспериментов с (2**29)-3 целыми числами, (2**29)-4 целыми числами, (2**29)-5 целыми числами и т. Д. Должны сказать вам довольно быстро.

...