Слишком большой размер массива - ruby - PullRequest
5 голосов
/ 10 сентября 2010

Я получаю сообщение «ArgumentError: размер массива слишком большой» со следующим кодом:

MAX_NUMBER = 600_000_000
my_array = Array.new(MAX_NUMBER)

Вопрос.Каково максимальное значение, которое функция Array.new принимает в Ruby?

1 Ответ

14 голосов
/ 11 сентября 2010

Массив с 500 миллионами элементов имеет размер 2 ГБ, что & ndash; в зависимости от используемой операционной системы & ndash; обычно это максимум, на который может обратиться процесс. Другими словами: ваш массив больше, чем ваше адресное пространство.

Итак, решения очевидны: либо уменьшите массив (скажем, разбив его на куски), либо увеличьте адресное пространство (в Linux вы можете исправить ядро, чтобы получить 3, 3,5 и даже 4 ГБайта адресного пространства и, конечно, переключение на 64-битную ОС и 64-битная реализация Ruby (!) также будет работать).

Кроме того, вам нужно переосмыслить свой подход. Может быть, использовать mmap вместо массива или что-то в этом роде. Может быть, ленивая загрузка только тех частей, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...