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