Длинные массивы используются, чтобы работать с данными, которые не помещаются в память, который поддерживается 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'
как недостающих данных так, чтобы datastore
заменил их на значения NaN
. Кроме того, установите формат нескольких текстовых переменных к %s
так, чтобы datastore
считал их как массивы ячеек из символьных векторов.
ds = datastore('airlinesmall.csv'); ds.TreatAsMissing = 'NA'; ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'TailNum')} = '%s'; ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'CancellationCode')} = '%s';
Составьте tall table из datastore. При выполнении вычислений на этой tall table, базовый datastore считывает куски данных и передает их в tall table для обработки. Ни 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 отображает некоторые строки, и вертикальные замещающие знаки, :
указывает, что больше строк существует в длинной таблице, которые в настоящее время не отображаются.
Если данным, с которыми вы работаете, сопоставили время с каждой строкой данных, то можно преобразовать длинную таблицу в длинное расписание. Существует несколько способов создать длинное расписание:
table2timetable
Преобразуйте длинную таблицу
array2timetable
Преобразуйте числовой длинный массив
расписание
Создайте длинное расписание с помощью существующих высоких переменных
В этом случае, длинная таблица, tt
сопоставили времена с каждой строкой, но они разломаны на несколько табличных переменных, таких как Year
, Month
, 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 также поддерживаются несколькими тулбоксами, что позволяет создавать алгоритмы машинного обучения, развертывать автономные приложения и выполнять вычисления параллельно или в кластере. Для получения дополнительной информации смотрите Расширение длинных массивов с помощью других продуктов.
datastore
| gather
| mapreducer
| table
| tall