"Высокие" массивы

Длинные массивы используются, чтобы работать с данными, которые не помещаются в память, который поддерживается datastore. Хранилища данных позволяют вам работать с большими наборами данных в маленьких фрагментах, которые индивидуально умещаются в памяти, вместо того, чтобы загрузить целый набор данных в память целиком. Длинные массивы расширяют эту возможность позволить вам работать с данными, которые не помещаются в память, с помощью общих функций.

Что такое Длинный массив?

Поскольку данные не загружаются в память целиком, длинные массивы могут быть произвольно большими в первой размерности (то есть, у них может быть любое количество строк). Вместо того, чтобы писать специальный код, который учитывает огромный размер данных, такой как с методами как MapReduce, длинные массивы позволяют вам работать с большими наборами данных интуитивным способом, который подобен способу, которым вы работали бы с массивами MATLAB® в оперативной памяти. Много базовых операторов и функций работают то же самое с длинными массивами, как они делают с массивами в оперативной памяти. MATLAB работает с маленькими фрагментами данных за один раз, обрабатывая все разделение на блоки данных и обработку в фоновом режиме, так, чтобы общие выражения, такие как A+B, работали с большими наборами данных.

Преимущества длинных массивов

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

Примечание

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

Составление длинных таблиц

Длинные таблицы похожи на таблицы MATLAB в оперативной памяти, за исключением того, что у них может быть любое количество строк. Чтобы составить длинную таблицу от большого набора данных, сначала необходимо создать datastore для данных. Если datastore, ds содержит табличные данные, то tall(ds) возвращает tall table, содержащего данные. Смотрите Datastore для получения дополнительной информации о создании хранилищ данных.

Создайте datastore электронной таблицы, который указывает на табличный файл данных о полете. Для папок, которые содержат набор файлов, можно задать целое местоположение папки или использовать подстановочный символ, '*.csv', чтобы включать несколько файлов с тем же расширением файла в datastore. Уберите данные путем обработки значений 'NA' как недостающих данных так, чтобы datastore заменил их на значения NaN. Кроме того, установите формат нескольких текстовых переменных к %s так, чтобы datastore считал их как массивы ячеек из символьных векторов.

ds = datastore('airlinesmall.csv');
ds.TreatAsMissing = 'NA';
ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'TailNum')} = '%s';
ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'CancellationCode')} = '%s';

Составьте tall table из datastore. При выполнении вычислений на этой tall table, базовый datastore считывает куски данных и передает их в tall table для обработки. Ни datastore, ни tall table не сохраняют никаких базовых данных.

tt = tall(ds)
tt =

  M×29 tall table 

    Year    Month    DayofMonth    DayOfWeek    DepTime    CRSDepTime    ArrTime    CRSArrTime    UniqueCarrier    FlightNum    TailNum    ActualElapsedTime    CRSElapsedTime    AirTime    ArrDelay    DepDelay    Origin    Dest     Distance    TaxiIn    TaxiOut    Cancelled    CancellationCode    Diverted    CarrierDelay    WeatherDelay    NASDelay    SecurityDelay    LateAircraftDelay
    ____    _____    __________    _________    _______    __________    _______    __________    _____________    _________    _______    _________________    ______________    _______    ________    ________    ______    _____    ________    ______    _______    _________    ________________    ________    ____________    ____________    ________    _____________    _________________

    1987    10       21            3             642        630           735        727          'PS'             1503         'NA'        53                   57               NaN         8          12          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       26            1            1021       1020          1124       1116          'PS'             1550         'NA'        63                   56               NaN         8           1          'SJC'     'BUR'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       23            5            2055       2035          2218       2157          'PS'             1589         'NA'        83                   82               NaN        21          20          'SAN'     'SMF'    480         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       23            5            1332       1320          1431       1418          'PS'             1655         'NA'        59                   58               NaN        13          12          'BUR'     'SJC'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       22            4             629        630           746        742          'PS'             1702         'NA'        77                   72               NaN         4          -1          'SMF'     'LAX'    373         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       28            3            1446       1343          1547       1448          'PS'             1729         'NA'        61                   65               NaN        59          63          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10        8            4             928        930          1052       1049          'PS'             1763         'NA'        84                   79               NaN         3          -2          'SAN'     'SFO'    447         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       10            6             859        900          1134       1123          'PS'             1800         'NA'       155                  143               NaN        11          -1          'SEA'     'LAX'    954         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    :       :        :             :            :          :             :          :             :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :
    :       :        :             :            :          :             :          :             :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :

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

Создание Tall Timetables

Если данным, с которыми вы работаете, сопоставили время с каждой строкой данных, то можно преобразовать длинную таблицу в длинное расписание. Существует несколько способов создать длинное расписание:

  • table2timetable Преобразуйте длинную таблицу

  • array2timetable Преобразуйте числовой длинный массив

  • расписание Создайте длинное расписание с помощью существующих высоких переменных

В этом случае, длинная таблица, tt сопоставили времена с каждой строкой, но они разломаны на несколько табличных переменных, таких как Year, Month, DayofMonth, и так далее. Объедините все эти части информации о datetime в одну новую высокую переменную Dates datetime, которая основана на времени отправления DepTime. Создайте длинное расписание с помощью Dates в качестве времен строки. Поскольку Dates является единственной переменной datetime в таблице, функция table2timetable автоматически использует его в течение времен строки.

hrs = (tt.DepTime - mod(tt.DepTime,100))/100;
mins = mod(tt.DepTime,100);
tt.Dates = datetime(tt.Year, tt.Month, tt.DayofMonth, hrs, mins, 0);
tt(:,1:8) = [];
TT = table2timetable(tt)
TT =

  M×21 tall timetable

            Dates           UniqueCarrier    FlightNum    TailNum    ActualElapsedTime    CRSElapsedTime    AirTime    ArrDelay    DepDelay    Origin    Dest     Distance    TaxiIn    TaxiOut    Cancelled    CancellationCode    Diverted    CarrierDelay    WeatherDelay    NASDelay    SecurityDelay    LateAircraftDelay
    ____________________    _____________    _________    _______    _________________    ______________    _______    ________    ________    ______    _____    ________    ______    _______    _________    ________________    ________    ____________    ____________    ________    _____________    _________________

    21-Oct-1987 06:42:00    'PS'             1503         'NA'        53                   57               NaN         8          12          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    26-Oct-1987 10:21:00    'PS'             1550         'NA'        63                   56               NaN         8           1          'SJC'     'BUR'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    23-Oct-1987 20:55:00    'PS'             1589         'NA'        83                   82               NaN        21          20          'SAN'     'SMF'    480         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    23-Oct-1987 13:32:00    'PS'             1655         'NA'        59                   58               NaN        13          12          'BUR'     'SJC'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    22-Oct-1987 06:29:00    'PS'             1702         'NA'        77                   72               NaN         4          -1          'SMF'     'LAX'    373         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    28-Oct-1987 14:46:00    'PS'             1729         'NA'        61                   65               NaN        59          63          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    08-Oct-1987 09:28:00    'PS'             1763         'NA'        84                   79               NaN         3          -2          'SAN'     'SFO'    447         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    10-Oct-1987 08:59:00    'PS'             1800         'NA'       155                  143               NaN        11          -1          'SEA'     'LAX'    954         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    :                       :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :
    :                       :      

Создание длинных массивов

Когда вы извлекаете переменную из длинной таблицы или длинного расписания, результатом является длинный массив соответствующего базового типа данных. Длинный массив может быть числовым, логическим, datetime, длительностью, календарной длительностью, категориальной, строка или массив ячеек. Кроме того, можно преобразовать массив в оперативной памяти A в длинный массив с tA = tall(A). Массив в оперативной памяти A должен быть одним из поддерживаемых типов данных.

Извлеките задержку прибытия ArrDelay от длинного расписания TT. Это создает новую переменную tall array с базовым типом данных double.

a = TT.ArrDelay
a =

  M×1 tall double column vector

     8
     8
    21
    13
     4
    59
     3
    11
    :
    :

classUnderlying и функции isaUnderlying полезны, чтобы определить базовый тип данных длинного массива.

Отсроченная оценка

Один важный аспект длинных массивов - то, что, когда вы работаете с ними, большинство операций сразу не выполняется. Эти операции, кажется, выполняются быстро, потому что фактическое вычисление задерживается, пока вы в частности не запрашиваете, чтобы вычисления были выполнены. Можно инициировать оценку длинного массива с любым функция gather (чтобы загрузить результат в память) или функция write (чтобы записать результат в диск). Эта отсроченная оценка важна, потому что даже простая команда как size(X), выполняемый на длинном массиве с миллиардом строк, не является быстрым вычислением.

Когда вы работаете с длинными массивами, MATLAB отслеживает все операции, которые будут выполнены. Эта информация затем используется, чтобы оптимизировать количество проходов через данные, которое будет требоваться, когда вы запросите вывод с функцией gather. Таким образом нормально работать с неоцененными длинными массивами, и запрос вывел только, когда вы требуете его. Для получения дополнительной информации смотрите Отсроченную оценку Длинных массивов.

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

m = mean(a,'omitnan')
m =

  tall double

    ?

Preview deferred. Learn more.
s = std(a,'omitnan')
s =

  tall

    ?

Preview deferred. Learn more.
one_sigma_bounds = [m-s m m+s]
one_sigma_bounds =

  M×N×... tall array

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

Preview deferred. Learn more.

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

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

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

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

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

sig1 = gather(one_sigma_bounds)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.5 sec
Evaluation completed in 1.8 sec

sig1 =

  -23.4572    7.1201   37.6975

Можно задать несколько вводов и выводов к gather, если вы хотите оценить несколько длинных массивов целиком. Этот метод быстрее, чем вызов gather многократно. Например, вычислите минимальную и максимальную задержку прибытия. Вычисленный отдельно, каждое значение требует, чтобы проход через данные вычислил для в общей сложности двух передач. Однако вычисление обоих значений одновременно требует только одного прохода через данные.

[max_delay, min_delay] = gather(max(a),min(a))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.1 sec
Evaluation completed in 1.1 sec

max_delay =

        1014


min_delay =

   -64

Эти результаты показывают, что в среднем, большинство рейсов прибывает с опозданием на 7 минут. Но в пределах одного стандартного отклонения на рейс это до 37 минут опоздания или 23 минуты раннего прибытия. Самый быстрый рейс в наборе данных прибыл примерно на час раньше, а последний рейс был задержан на много часов.

Сохранение, загрузка и выгрузка длинных массивов

Функция save сохраняет состояние длинного массива, но не копирует ни одних из данных. Получившийся файл .mat является обычно маленьким. Однако исходные файлы данных должны быть доступными в том же месте по порядку, чтобы впоследствии использовать load.

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

Можно воссоздать длинный массив из записанных файлов путем создания нового datastore, который указывает на местоположение, где файлы были записаны. Эта функциональность позволяет вам создать контрольные точки или снимки состояния данных о длинном массиве. Создание контрольной точки является хорошим способом сохранить результаты предварительной обработки ваших данных, так, чтобы данные были в форме, которая более эффективна, чтобы загрузить.

Если у вас есть длинный массив TA, то можно записать его в папку location с командой:

write(location,TA);

Позже, чтобы восстановить TA из записанных файлов, используйте команды:

ds = datastore(location);
TA = tall(ds);

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

Поддерживание функций

Большинство базовых функций работает одинаково с длинными массивами, как они делают с массивами в оперативной памяти. Однако в некоторых случаях способ, которым функция работает с длинными массивами, является особенным или имеет ограничения. Можно сказать, поддерживает ли функция длинные массивы, и если она имеет любые ограничения путем взгляда в нижней части страницы с описанием для функции в разделе Extended Capabilities (для примера, смотрите filloutliers).

Для отфильтрованного списка всех функций MATLAB, которые поддерживают длинные массивы, см. Функциональный Список (Длинные массивы).

Tall arrays также поддерживаются несколькими тулбоксами, что позволяет создавать алгоритмы машинного обучения, развертывать автономные приложения и выполнять вычисления параллельно или в кластере. Для получения дополнительной информации смотрите Расширение длинных массивов с помощью других продуктов.

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

| | | |

Похожие темы