Отсроченная оценка длинных массивов

Одно из различий между длинными массивами и массивами MATLAB® в оперативной памяти - то, что длинные массивы обычно остаются неоцененными, пока вы не запрашиваете это, вычисления выполняются. (Исключения к этому правилу включают функции построения графика как plot и histogram и некоторые статистические подходящие функции как fitlm, которые автоматически оценивают входные параметры длинного массива.), В то время как длинный массив находится в неоцененном состоянии, MATLAB не может знать свой размер, свой тип данных или определенные значения, которые это содержит. Однако можно все еще использовать неоцененные массивы в вычислениях, как будто значения были известны. Это позволяет вам работать быстро с большими наборами данных вместо того, чтобы ожидать каждой команды, чтобы выполниться. Поэтому рекомендуется, чтобы вы использовали gather только, когда вы требуете вывода.

MATLAB отслеживает все операции, которые вы выполняете на неоцененных длинных массивах, когда вы вводите их. Когда вы в конечном счете вызываете gather, чтобы оценить операции в очереди, MATLAB использует историю неоцененных команд, чтобы оптимизировать вычисление путем минимизации количества проходов через данные. При правильном использовании эта оптимизация может сэкономить огромное количество времени выполнения, исключив ненужные проходы через большие наборы данных.

Отображение неоцененных длинных массивов

Отображение неоцененных длинных массивов отличается в зависимости от того, сколько MATLAB знает о массиве и его значениях. Существует три данных, отраженных в отображении:

  • Размер массивов — размеры Неизвестного измерения представлены переменными M или N в отображении. Если никакие размеры размерности не известны, то размер появляется как MxNx.....

  • Тип данных массива — Если массив имеет неизвестный базовый тип данных, то его тип появляется как tall array. Если тип известен, он перечислен как, например, tall double array.

  • Значения массивов — Если значения массивов неизвестны, то они появляются как ?. Известные значения отображены.

MATLAB может знать все, некоторых или ни одни из этих данных о данном длинном массиве, в зависимости от природы вычисления.

Например, если массив имеет известный тип данных, но неизвестный размер и значения, то неоцененный длинный массив может выглядеть так:

M×N×... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Если тип и относительный размер известны, то отображение могло быть:

 1×N tall char array

    ?    ?    ?  ...

Если некоторые данные известны, то MATLAB отображает известные значения:

  100×3 tall double matrix

    0.8147    0.1622    0.6443
    0.9058    0.7943    0.3786
    0.1270    0.3112    0.8116
    0.9134    0.5285    0.5328
    0.6324    0.1656    0.3507
    0.0975    0.6020    0.9390
    0.2785    0.2630    0.8759
    0.5469    0.6541    0.5502
      :         :         :
      :         :         :

Оценка с собирается

Функция gather используется, чтобы оценить длинные массивы. gather принимает длинные массивы как входные параметры и возвращает массивы в оперативной памяти как выходные параметры. Поэтому можно думать об этой функции как о мосте между длинными массивами и массивами в оперативной памяти. Например, вы не можете управлять if или инструкциями циклов while с помощью высокого логического массива, но если массив оценен с gather, это становится логическим значением в оперативной памяти, которое можно использовать в этих контекстах.

gather выполняет все операции в очереди на длинном массиве и возвращает целый результат в памяти. Поскольку gather возвращает результаты как массивы MATLAB в оперативной памяти, стандартные факторы памяти применяются. В MATLAB может закончиться память, если результат, возвращенный gather, является слишком большим.

Наиболее часто можно использовать gather, чтобы видеть целый результат вычисления, особенно если вычисление включает операцию сокращения, такую как sum или mean. Однако, если результат является слишком большим, чтобы уместиться в памяти, то можно использовать gather(head(X)) или gather(tail(X)), чтобы выполнить вычисление и взгляд на только первое или последние несколько строк результата.

Разрешите, что Ошибки с собираются

Если вы вводите ошибочную команду, и gather не удается оценить переменную длинного массива, то необходимо удалить переменную из рабочей области и воссоздать длинный массив с помощью только допустимые команды. Это вызвано тем, что MATLAB отслеживает все операции, которые вы выполняете на неоцененных длинных массивах, когда вы вводите их. Единственный способ заставить MATLAB “забыть” об ошибочном операторе состоит в том, чтобы восстановить длинный массив с нуля.

Пример: Вычисление размера длинного массива

Этот пример показывает то, на что неоцененный длинный массив похож, и как оценить массив.

Создайте datastore для набора данных airlinesmall.csv. Преобразуйте datastore в длинную таблицу и затем вычислите размер.

varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'};
ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ...
'SelectedVariableNames', varnames);
tt = tall(ds)
tt =

  M×4 tall table

    ArrDelay    DepDelay    Origin    Dest 
    ________    ________    ______    _____

        8          12       'LAX'     'SJC'
        8           1       'SJC'     'BUR'
       21          20       'SAN'     'SMF'
       13          12       'BUR'     'SJC'
        4          -1       'SMF'     'LAX'
       59          63       'LAX'     'SJC'
        3          -2       'SAN'     'SFO'
       11          -1       'SEA'     'LAX'
       :           :          :         :
       :           :          :         :
s = size(tt)
s =

  1×2 tall double row vector

    ?    ?

Preview deferred. Learn more.

Вычисление размера длинного массива дает маленький ответ (1 2 вектор), но отображение указывает, что целый проход через данные все еще требуется, чтобы вычислять размер tt.

Используйте функцию gather, чтобы полностью оценить длинный массив и загрузить результаты в память. Когда команда выполняется, существует динамическое отображение прогресса в командном окне, которое особенно полезно с долгими вычислениями.

Примечание

Всегда гарантируйте, что результат, возвращенный gather, сможет уместиться в памяти. Если вы используете gather непосредственно на длинном массиве, не уменьшая его размер с помощью функции, такой как mean, то в MATLAB может закончиться память.

tableSize = gather(s)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.42 sec
Evaluation completed in 0.48 sec

tableSize =

      123523           4

Пример: Многопроходные вычисления с длинными массивами

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

Создайте datastore для набора данных airlinesmall.csv. Преобразуйте datastore в длинную таблицу.

varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'};
ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ...
'SelectedVariableNames', varnames);
tt = tall(ds)
tt =

  M×4 tall table

    ArrDelay    DepDelay    Origin    Dest 
    ________    ________    ______    _____

        8          12       'LAX'     'SJC'
        8           1       'SJC'     'BUR'
       21          20       'SAN'     'SMF'
       13          12       'BUR'     'SJC'
        4          -1       'SMF'     'LAX'
       59          63       'LAX'     'SJC'
        3          -2       'SAN'     'SFO'
       11          -1       'SEA'     'LAX'
       :           :          :         :
       :           :          :         :

Вычтите среднее значение DepDelay от ArrDelay, чтобы создать новую переменную AdjArrDelay. Затем вычислите среднее значение AdjArrDelay и вычтите это среднее значение из AdjArrDelay. Если бы эти вычисления были все оценены отдельно, то MATLAB потребовал бы четырех проходов через данные.

AdjArrDelay = tt.ArrDelay - mean(tt.DepDelay,'omitnan');
AdjArrDelay = AdjArrDelay - mean(AdjArrDelay,'omitnan')
AdjArrDelay =

  M×1 tall double column vector

    ?
    ?
    ?
    :
    :

Preview deferred. Learn more.

Оцените AdjArrDelay и просмотрите первые несколько строк. Поскольку некоторые вычисления могут быть объединены, только три прохода через данные требуются.

gather(head(AdjArrDelay))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 3: Completed in 0.4 sec
- Pass 2 of 3: Completed in 0.39 sec
- Pass 3 of 3: Completed in 0.23 sec
Evaluation completed in 1.2 sec

ans =

    0.8799
    0.8799
   13.8799
    5.8799
   -3.1201
   51.8799
   -4.1201
    3.8799

Резюме поведения и рекомендации

  1. Длинные массивы остаются неоцененными, пока вы не запрашиваете вывод с помощью gather.

  2. Используйте gather в большинстве случаев, чтобы оценить вычисления длинного массива. Если вы полагаете, что результат вычислений не может уместиться в памяти, затем использовать gather(head(X)) или gather(tail(X)) вместо этого.

  3. Работайте в основном с недооцененными tall arrays и запрашивайте вывод только при необходимости. Чем больше вычислений в очереди, которые не оценены, тем больше оптимизации MATLAB может сделать, чтобы минимизировать количество проходов через данные.

  4. Если вы вводите ошибочную команду длинного массива, и gather не удается оценить переменную длинного массива, то необходимо удалить переменную из рабочей области и воссоздать длинный массив с помощью только допустимые команды.

Смотрите также

|

Похожие темы