exponenta event banner

Массивы Tall для данных без памяти

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

Что такое массив Tall Array?

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

Преимущества массивов Tall

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

Примечание

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

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

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

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

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

Создайте высокую таблицу из хранилища данных. При выполнении вычислений для этой таблицы высокого уровня нижележащее хранилище данных считывает блоки данных и передает их в таблицу высокого уровня для обработки. Ни в хранилище данных, ни в таблице высокого уровня не хранятся какие-либо из базовых данных.

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

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

В этом случае высокий стол tt имеет время, связанное с каждой строкой, но они разбиты на несколько переменных таблицы, таких как Year, Month, DayofMonthи так далее. Объединение всех этих частей информации datetime в одну новую переменную tall datetime Dates, который основан на времени вылета 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              
    :                       :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :
    :                       :      

Создание массивов Tall

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

Извлеките задержку поступления ArrDelay из высокого расписания TT. При этом создается новая переменная массива высокого уровня с двойным типом данных.

a = TT.ArrDelay
a =

  M×1 tall double column vector

     8
     8
    21
    13
     4
    59
     3
    11
    :
    :

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

Отложенная оценка

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

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

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

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.

Оценка с помощью gather

Преимущество отложенной оценки состоит в том, что когда для выполнения вычислений 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 если вы хотите вычислить сразу несколько массивов tall. Этот метод быстрее, чем вызов 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 копирует данные, они не зависят от исходных необработанных данных. Поэтому можно воссоздать массив высокого уровня из записанных файлов, даже если исходные необработанные данные больше недоступны.

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

При наличии массива высокого уровня TA, то вы можете записать его в папку location с помощью команды:

write(location,TA);

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

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

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

Вспомогательные функции

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

Отфильтрованный список всех функций MATLAB, поддерживающих массивы tall, см. в разделе Список функций (массивы Tall).

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

См. также

| | | |

Связанные темы