У меня есть большой массив (multi-GB) в Matlab, который я хочу обрезать¹. Наивно, я думал, что усечение не может потребовать много памяти, но потом я понял, что он, вероятно, может:
>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.
Если Matlab не делает некоторые умные оптимизации, перед усечением Z
этот код фактически создает массив (типа double!) 364000000:628000000
. Мне не нужен этот массив, поэтому я могу сделать это:
>> Z = Z(1:363999999);
В этом случае второй пример работает и подходит для моей цели. Но почему это работает? Если Z(364000000:end) = 0
выходит из строя из-за памяти, необходимой для промежуточного массива 364000000:628000000
, то почему не Z = Z(1:363999999)
не удается из-за памяти, необходимой для промежуточного массива 1:363999999
, что больше? Конечно, мне не нужен этот промежуточный массив, и я был бы доволен решением, которое усекает мой массив без промежуточного массива, или, если это не так, если Matlab оптимизирует определенный метод.
- Есть ли способ обрезать массив без создания промежуточного массива индексирования?
- Если нет, то какой из вышеперечисленных методов более эффективен с точки зрения памяти, чем другой (кажется, что он есть)? Если да, то почему? Действительно ли Matlab создает промежуточные массивы в обоих примерах?
¹Reason: Я обрабатываю данные, но не знаю, как много предварительно распределить. Я понимаю, что часто выделяю слишком много. Я выбираю размер блока на основе доступной памяти, потому что расщепление в меньшем количестве фрагментов означает более быстрый код. Поэтому я хочу избежать ненужного использования памяти. См. Также этот пост при распределении по фрагменту.