В этом примере показано, как использовать массивы tall для работы с большими данными в MATLAB ®. Массивы tall можно использовать для выполнения различных вычислений с различными типами данных, которые не помещаются в память. К ним относятся базовые вычисления, а также алгоритмы машинного обучения в Toolbox™ статистики и машинного обучения.
Этот пример работает с небольшим подмножеством данных на одном компьютере, а затем масштабируется для анализа всего набора данных. Однако этот метод анализа может расширяться еще больше для работы с наборами данных, которые настолько велики, что их невозможно считать в память, или для работы с такими системами, как Apache Spark™.
Массивы Tall и таблицы Tall используются для работы с данными из памяти, имеющими любое количество строк. Вместо написания специализированного кода, учитывающего огромный размер данных, массивы и таблицы tall позволяют работать с большими наборами данных аналогично массивам MATLAB ® в памяти. Разница в том, чтоtall массивы обычно остаются невысокими до тех пор, пока не будет запрошено выполнение вычислений.
Этот отложенный анализ позволяет MATLAB объединять вычисления в очереди, где это возможно, и выполнять минимальное количество проходов через данные. Поскольку количество проходов через данные сильно влияет на время выполнения, рекомендуется запрашивать вывод только при необходимости.
Создание хранилища данных позволяет получить доступ к коллекции данных. Хранилище данных может обрабатывать произвольно большие объемы данных, и данные могут быть даже распределены по нескольким файлам в нескольких папках. Можно создать хранилище данных для большинства типов файлов, включая коллекцию табличных текстовых файлов (показано здесь), электронные таблицы, изображения, базу данных SQL (требуется Toolbox™ базы данных), файлы последовательности Hadoop ® и многое другое.
Создание хранилища данных для .csv файл, содержащий данные авиакомпании. Удовольствие 'NA' значения отсутствуют, так что tabularTextDatastore заменяет их на NaN значения. Выберите переменные, представляющие интерес, и укажите категориальный тип данных для Origin и Dest переменные. Предварительный просмотр содержимого.
ds = tabularTextDatastore('airlinesmall.csv'); ds.TreatAsMissing = 'NA'; ds.SelectedVariableNames = {'Year','Month','ArrDelay','DepDelay','Origin','Dest'}; ds.SelectedFormats(5:6) = {'%C','%C'}; pre = preview(ds)
pre=8×6 table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
1987 10 8 12 LAX SJC
1987 10 8 1 SJC BUR
1987 10 21 20 SAN SMF
1987 10 13 12 BUR SJC
1987 10 4 -1 SMF LAX
1987 10 59 63 LAX SJC
1987 10 3 -2 SAN SFO
1987 10 11 -1 SEA LAX
Массивы Tall аналогичны массивам MATLAB в памяти, за исключением того, что они могут иметь любое количество строк. Массивы Tall могут содержать числовые, логические данные, данные datetime, данные duration, calendarDuration, категориальные данные или строки. Кроме того, можно преобразовать любой массив в памяти в массив высокого уровня. (Массив в памяти A должен быть одним из поддерживаемых типов данных.)
Базовый класс массива высокого уровня основан на типе хранилища данных, которое его поддерживает. Например, если хранилище данных ds содержит табличные данные, затем tall(ds) возвращает таблицу высокого уровня, содержащую данные.
tt = tall(ds)
tt =
Mx6 tall table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
? ? ? ? ? ?
? ? ? ? ? ?
? ? ? ? ? ?
: : : : : :
: : : : : :
Отображение указывает базовый тип данных и включает в себя первые несколько строк данных. Размер таблицы отображается как «Mx6», что указывает на то, что MATLAB еще не знает, сколько строк данных.
Можно работать с массивами и таблицами высокого уровня аналогично работе с массивами и таблицами MATLAB в памяти.
Важным аспектом массивов tall является то, что при работе с ними MATLAB не выполняет большинство операций немедленно. Эти операции выполняются быстро, поскольку фактическое вычисление откладывается до тех пор, пока вы не запросите вывод. Эта отложенная оценка важна, потому что даже простая команда, как size(X) выполнение на высоком массиве с миллиардом строк не является быстрым вычислением.
При работе с массивами tall MATLAB отслеживает все выполняемые операции и оптимизирует количество проходов через данные. Таким образом, нормально работать с нерасчетными массивами tall и запрашивать выходные данные только тогда, когда это необходимо. MATLAB не знает содержимое или размер нерасчетных массивов tall до тех пор, пока не будет запрошен анализ и отображение массива.
Рассчитайте среднюю задержку отправления.
mDep = mean(tt.DepDelay,'omitnan')mDep =
tall double
?
Преимущество отложенной оценки состоит в том, что когда для выполнения вычислений MATLAB приходит время, часто можно объединить операции таким образом, чтобы минимизировать количество проходов через данные. Таким образом, даже если вы выполняете много операций, MATLAB делает дополнительные проходы через данные только в случае крайней необходимости.
gather функция вынуждает оценивать все поставленные в очередь операции и возвращает полученные выходные данные обратно в память. С тех пор gather возвращает весь результат в MATLAB, необходимо убедиться, что результат умещается в памяти. Например, использовать gather на массивах tall, которые являются результатом функции, уменьшающей размер массива tall, такой как sum, min, meanи так далее.
Использовать gather вычислить среднюю задержку отправления и ввести ответ в память. Для этого расчета требуется один проход через данные, но для других расчетов может потребоваться несколько проходов через данные. MATLAB определяет оптимальное количество проходов для расчета и отображает эту информацию в командной строке.
mDep = gather(mDep)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.72 sec - Pass 2 of 2: Completed in 0.67 sec Evaluation completed in 1.8 sec
mDep = 8.1860
Можно извлечь значения из массива с высоким значением путем индексирования или индексирования. Можно индексировать массив, начиная с верхнего или нижнего или используя логический индекс. Функции head и tail являются полезными альтернативами индексации, позволяя исследовать первую и последнюю части массива высокого уровня. Соберите обе переменные одновременно, чтобы избежать дополнительных проходов через данные.
h = head(tt); tl = tail(tt); [h,tl] = gather(h,tl)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.63 sec Evaluation completed in 0.79 sec
h=8×6 table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
1987 10 8 12 LAX SJC
1987 10 8 1 SJC BUR
1987 10 21 20 SAN SMF
1987 10 13 12 BUR SJC
1987 10 4 -1 SMF LAX
1987 10 59 63 LAX SJC
1987 10 3 -2 SAN SFO
1987 10 11 -1 SEA LAX
tl=8×6 table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
2008 12 14 1 DAB ATL
2008 12 -8 -1 ATL TPA
2008 12 1 9 ATL CLT
2008 12 -8 -4 ATL CLT
2008 12 15 -2 BOS LGA
2008 12 -15 -1 SFO ATL
2008 12 -12 1 DAB ATL
2008 12 -1 11 ATL IAD
Использовать head чтобы выбрать подмножество из 10 000 строк из данных для прототипирования кода перед масштабированием до полного набора данных.
ttSubset = head(tt,10000);
Можно использовать типичные логические операции с массивами tall, которые полезны для выбора соответствующих данных или удаления отклонений с логической индексацией. Логическое выражение создает высокий логический вектор, который затем используется для подстрочной индексации, идентифицируя строки, в которых условие истинно.
Выберите только рейсы из Бостона, сравнив элементы категориальной переменной Origin к значению 'BOS'.
idx = (ttSubset.Origin == 'BOS');
bosflights = ttSubset(idx,:)bosflights =
207x6 tall table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
1987 10 -8 0 BOS LGA
1987 10 -13 -1 BOS LGA
1987 10 12 11 BOS BWI
1987 10 -3 0 BOS EWR
1987 10 -5 0 BOS ORD
1987 10 31 19 BOS PHL
1987 10 -3 0 BOS CLE
1987 11 5 5 BOS STL
: : : : : :
: : : : : :
Для удаления строк с отсутствующими данными или значениями NaN из массива с высоким значением можно использовать тот же метод индексирования.
idx = any(ismissing(ttSubset),2); ttSubset(idx,:) = [];
В связи с характером больших данных сортировка всех данных с использованием традиционных методов, таких как sort или sortrows неэффективно. Тем не менее, topkrows функция для массивов tall возвращает верхний k строки в отсортированном порядке.
Рассчитайте 10 самых больших задержек вылета.
biggestDelays = topkrows(ttSubset,10,'DepDelay');
biggestDelays = gather(biggestDelays)Evaluating tall expression using the Local MATLAB Session: Evaluation completed in 0.061 sec
biggestDelays=10×6 table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
1988 3 772 785 ORD LEX
1989 3 453 447 MDT ORD
1988 12 397 425 SJU BWI
1987 12 339 360 DEN STL
1988 3 261 273 PHL ROC
1988 7 261 268 BWI PBI
1988 2 257 253 ORD BTV
1988 3 236 240 EWR FLL
1989 2 263 227 BNA MOB
1989 6 224 225 DFW JAX
Построение каждой точки в наборе больших данных невозможно. По этой причине визуализация массивов tall включает в себя уменьшение количества точек данных с помощью выборки или биннинга.
Визуализация количества рейсов в год с помощью гистограммы. Функции визуализации проходят через данные и немедленно оценивают решение при их вызове, поэтому gather не требуется.
histogram(ttSubset.Year,'BinMethod','integers')
Evaluating tall expression using the Local MATLAB Session: Evaluation completed in 0.39 sec
xlabel('Year') ylabel('Number of Flights') title('Number of Flights by Year, 1987 - 1989')

Вместо использования меньших данных, возвращенных из head, можно масштабировать для выполнения вычислений по всему набору данных с помощью результатов из tall(ds).
tt = tall(ds); idx = any(ismissing(tt),2); tt(idx,:) = []; mnDelay = mean(tt.DepDelay,'omitnan'); biggestDelays = topkrows(tt,10,'DepDelay'); [mnDelay,biggestDelays] = gather(mnDelay,biggestDelays)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.39 sec - Pass 2 of 2: Completed in 0.59 sec Evaluation completed in 1.1 sec
mnDelay = 8.1310
biggestDelays=10×6 table
Year Month ArrDelay DepDelay Origin Dest
____ _____ ________ ________ ______ ____
1991 3 -8 1438 MCO BWI
1998 12 -12 1433 CVG ORF
1995 11 1014 1014 HNL LAX
2007 4 914 924 JFK DTW
2001 4 887 884 MCO DTW
2008 7 845 855 CMH ORD
1988 3 772 785 ORD LEX
2008 4 710 713 EWR RDU
1998 10 679 673 MCI DFW
2006 6 603 626 ABQ PHX
histogram(tt.Year,'BinMethod','integers')
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.86 sec - Pass 2 of 2: Completed in 0.48 sec Evaluation completed in 1.6 sec
xlabel('Year') ylabel('Number of Flights') title('Number of Flights by Year, 1987 - 2008')

Использовать histogram2 для дальнейшей разбивки количества рейсов по месяцам для всего набора данных. Поскольку ячейки для Month и Year известны заранее, укажите края ячейки, чтобы избежать дополнительного прохождения через данные.
year_edges = 1986.5:2008.5; month_edges = 0.5:12.5; histogram2(tt.Year,tt.Month,year_edges,month_edges,'DisplayStyle','tile')
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.72 sec Evaluation completed in 0.78 sec
colorbar xlabel('Year') ylabel('Month') title('Airline Flights by Month and Year, 1987 - 2008')

Вы можете выполнять более сложный статистический анализ в массивах tall, в том числе вычислять прогнозную аналитику и выполнять машинное обучение, используя функции в Toolbox™ Статистика и машинное обучение.
Дополнительные сведения см. в разделе Анализ больших данных с помощью массивов Tall (Statistics and Machine Learning Toolbox).
Ключевая возможность tall-массивов в MATLAB - подключение к платформам больших данных, таким как вычислительные кластеры и Spark™ Apache.
Этот пример только царапает поверхность того, что возможно с помощью высоких массивов для больших данных. Дополнительные сведения об использовании см. в разделе Расширение массивов с другими продуктами:
Статистика и машинное обучение Toolbox™
Toolbox™ базы данных
Параллельные вычисления Toolbox™
Параллельный Server™ MATLAB ®
MATLAB Compiler™