Длинные массивы for Данная , Которая Не Помещаются в Память,

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

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

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

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

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

Примечание

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

Создание Длинные таблицы

Длинные таблицы как в памяти MATLAB таблиц, за исключением того, что они могут иметь любое количество строк. Чтобы создать длинная таблица из большого набора данных, вам сначала нужно создать datastore для данных. Если datastore ds содержит табличные данные, затем tall(ds) возвращает длинная таблица или длинное расписание, содержащие данные. Дополнительные сведения о создании хранилищ данных см. в разделе 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';

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

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

Создание Длинные расписания

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

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

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

Извлеките задержку прибытия ArrDelay из длинное расписание TT. Это создает новую переменную длинный массив с базовым типом данных 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.

Оценка с gather

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

gather функция вынуждает оценивать все операции в очереди и выводит полученный выход в память. По этой причине можно думать о gather как мост между длинные массивы и in-memory arrays. Для примера вы не можете управлять if или while циклы с использованием tall logical array, но после оценки массива с 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, поддерживающих длинные массивы, см. в Списке функций ( Длинных массивов).

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

См. также

| | | |

Похожие темы