Максимальный размер массива в MATLAB? - PullRequest
6 голосов
/ 25 февраля 2010

Я пишу программу MATLAB, которая сгенерирует матрицу с 1 миллионом строк и неизвестным количеством столбцов (максимум 1 миллион).

Я пытался предварительно выделить эту матрицу:

a=zeros(1000000,1000000)

но я получил ошибку:

"Превышен максимально допустимый размер программы."

У меня такое ощущение, что предварительное выделение этой матрицы серьезно замедлит код.

Это заставило меня задуматься: каков максимальный размер массива в MATLAB?

Обновление: Я собираюсь изучить разреженные матрицы, потому что результатом, к которому я стремлюсь в этой конкретной задаче, будет матрица, состоящая из большей части нулей.

Ответы [ 4 ]

8 голосов
/ 25 февраля 2010

Взгляните на эту страницу, там перечислены максимальные размеры: Макс. Размеры

Похоже, порядка нескольких сотен миллионов. Обратите внимание, что матрица, которую вы пытаетесь создать здесь: 10e6 * 10e6 = 10e12 элементов. Это на много порядков больше, чем предоставленные максимальные размеры, и у вас также недостаточно оперативной памяти в вашей системе.

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

6 голосов
/ 25 февраля 2010

Чтобы узнать максимальный размер массива real (только для Windows), используйте команду user = memory . user.maxPossibleArrayBytes показывает, сколько байтов непрерывной оперативной памяти свободно. Разделите это на число байтов на элемент вашего массива (8 для двойников), и вы знаете максимальное количество элементов, которое вы можете предварительно выделить.

Обратите внимание, что, как сказал woodchips , Matlab, возможно, придется скопировать ваш массив (например, если вы передаете по значению подфункцию). По моему опыту 75% максимально возможного массива обычно доступны несколько раз.

2 голосов
/ 06 марта 2015

Пределы

Есть два разных ограничения, о которых следует знать:

  1. Максимальный размер массива (с точки зрения количества элементов), разрешенный MATLAB, независимо от текущей доступности памяти.
  2. Текущие байты, доступные для одного массива - (текущий) максимально возможный размер массива в байтах.

Первый предел - это то, что вызывает "Превышен максимальный размер переменной, разрешенный программой" , а не второй предел. Однако второй также является практическим пределом, о котором вы должны знать!

Проверка лимитов

Максимально допустимое количество элементов для массива проверяется следующим образом:

>> [~,maxsize] = computer
maxsize =
   2.8147e+14

Согласно документации для команды computer , возвращается:

максимальное количество элементов, разрешенных в матрице в этой версии MATLAB

Это статический предел MATLAB для количества элементов , не зависит от состояния компьютера (технические характеристики оборудования и текущее использование памяти). Более 2 петабайт для массива double такой длины также намного выше, чем у любого компьютера, о котором я знаю!

С другой стороны, наибольший практический размер массива, который вы можете создать в любой момент, можно проверить с помощью команды memory:

>> memory
Maximum possible array:     35237 MB (3.695e+10 bytes) *
Memory available for all arrays:     35237 MB (3.695e+10 bytes) *
Memory used by MATLAB:      9545 MB (1.001e+10 bytes)
Physical Memory (RAM):     24574 MB (2.577e+10 bytes)

*  Limited by System Memory (physical + swap file) available.

Как говорится в сообщении, эти значения основаны на фактической текущей доступности памяти с учетом как физической памяти, так и файла подкачки (вместе, виртуальной памяти).

При необходимости к этим значениям можно получить программный доступ с помощью m = memory;.

Регулировка пределов

Первый предел (жесткий предел) был исправлен вплоть до R2015a, где он теперь может быть изменен (но только уменьшен до доли системной памяти) с помощью следующей настройки:

enter image description here

Вы не можете увеличить его за пределы вашей системы.

Второй предел, очевидно, не имеет «настройки» в MATLAB, поскольку он основан на доступной памяти и конфигурации компьютера. Помимо добавления оперативной памяти, вы не можете многое сделать: (1) pack для консолидации памяти рабочей области и выполнения «сборки мусора», но это может помочь только на определенных платформах и (2) увеличение размер файла подкачки, чтобы другие объекты могли поменяться местами и дать MATLAB больше физической памяти. Но будьте осторожны, полагаясь на файл подкачки, так как ваш компьютер может перестать отвечать на запросы, если перехват файла подкачки .

0 голосов
/ 25 августа 2011

В старых версиях Matlab, которые не включают команду памяти, вы можете использовать:

функция memstats

Physical Memory (RAM):
    In Use:                              738 MB (2e2c3000)
    Free:                                273 MB (11102000)
    Total:                              1011 MB (3f3c5000)
Page File (Swap space):
    In Use:                             1321 MB (529a4000)
    Free:                               1105 MB (45169000)
    Total:                              2427 MB (97b0d000)
Virtual Memory (Address Space):
    In Use:                              887 MB (37723000)
    Free:                               1160 MB (488bd000)
    Total:                              2047 MB (7ffe0000)
Largest Contiguous Free Blocks:
     1. [at 4986b000]                    197 MB ( c585000)
     2. [at 3e1b9000]                    178 MB ( b2a7000)
     3. [at 1f5a0000]                    104 MB ( 6800000)
     4. [at 56032000]                     77 MB ( 4d3e000)
     5. [at 68b40000]                     70 MB ( 4660000)
     6. [at 3a320000]                     54 MB ( 3610000)
     7. [at 63568000]                     45 MB ( 2d48000)
     8. [at 35aff000]                     40 MB ( 2821000)
     9. [at 60f86000]                     37 MB ( 25ca000)
    10. [at 6f49d000]                     37 MB ( 25b3000)
                                        ======= ==========
                                         842 MB (34ac0000)

ans =

   207114240

Вы не можете подавить вывод, но он возвращает самый большой из доступных блоков памяти (207,114,240 байт / 8 = 25,889,280 удваивается)

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