Длинные массивы используются для работы с данными , которыми не помещаютсями в память,, которые поддерживаются datastore
. Datastores позволяет работать с большими наборами данных в небольших блоках, которые индивидуально помещаются в памяти, вместо загрузки сразу всего набора данных в память. Длинными массивами расширить эту возможность, чтобы вы могли работать со данной , которой не помещаютсей в память,, используя общие функции.
Поскольку данные не загружаются в память сразу, длинные массивы могут быть произвольно большими в первой размерности (то есть они могут иметь любое количество строк). Вместо записи специального кода, который учитывает огромный размер данных, например, с такими методами, как MapReduce, длинные массивы позволяют вам работать с большими наборами данных интуитивно подобно тому, как вы работали бы с MATLAB в памяти® массивы. Многие основные операторы и функции работают так же с длинные массивы, как и с массивами в памяти. MATLAB работает с небольшими блоками данных за раз, обрабатывая все куски данных и обрабатывая их в фоновом режиме, так что общие выражения, такие как A+B
, работать с наборами больших данных.
В отличие от массивов в памяти, длинные массивы обычно остаются недооцененными, пока вы не запросите, чтобы вычисления были выполнены с помощью gather
функция. Эта отсроченная оценка позволяет быстро работать с большими наборами данных. Когда вы в конечном счете запрашиваете выход используя gather
MATLAB объединяет вычисления в очереди, где это возможно, и принимает минимальное количество проходов через данные. Количество проходов через данные сильно влияет на время выполнения, поэтому рекомендуется запрашивать выход только при необходимости.
Примечание
С тех пор 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, поддерживающих длинные массивы, см. в Списке функций ( Длинных массивов).
Длинные массивы также поддерживаются несколькими тулбоксами, что позволяет создавать алгоритмы машинного обучения, развертывать автономные приложения и выполнять вычисления параллельно или в кластере. Для получения дополнительной информации см. Раздел «Расширение длинных массивов другими продуктами».
datastore
| gather
| mapreducer
| table
| tall