Длинные массивы для данных, которые не помещаются в память,

Длинные массивы используются, чтобы работать с данными, которые не помещаются в память, который поддерживается 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' значения как недостающие данные так, чтобы 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';

Составьте tall table из datastore. Когда вы выполняете вычисления на этой длинной таблице, базовых блоках данных чтений datastore, и передает их длинной таблице к процессу. Ни 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

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

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

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

| | | |

Похожие темы