Этот пример показывает, как использовать длинные массивы, чтобы работать с большими данными в MATLAB®. Можно использовать длинные массивы, чтобы выполнить множество вычислений на различных типах данных, которые не умещаются в памяти. Они включают основные вычисления, а также алгоритмы машинного обучения в Statistics and Machine Learning Toolbox™.
Этот пример работает с небольшим подмножеством данных по одиночному компьютеру, и затем это затем масштабирует, чтобы анализировать весь набор данных. Однако этот аналитический метод может масштабировать еще больше, чтобы работать над наборами данных, которые являются настолько большими, они не могут быть считаны в память, или работать над системами как Apache Spark™.
Длинные массивы и длинные таблицы используются, чтобы работать с данными, которые не помещаются в память, который имеет любое количество строк. Вместо того, чтобы писать специализированный код, который учитывает огромный размер данных, длинные массивы и таблицы позволяют вам работать с большими наборами данных способом, подобным массивам MATLAB® в оперативной памяти. Различие - то, что массивы tall
обычно остаются неоцененными, пока вы не запрашиваете, чтобы вычисления были выполнены.
Эта отсроченная оценка позволяет MATLAB объединить вычисления в очереди, где возможный и берут минимальное количество проходов через данные. Поскольку количество проходов через данные значительно влияет на время выполнения, рекомендуется, чтобы вы запросили вывод только при необходимости.
Создание datastore для Набора Файлов
Создание datastore
позволяет вам получить доступ к набору данных. datastore
может обработать произвольно большие объемы данных, и данные могут даже быть распространены через несколько файлов в нескольких папках. Можно создать datastore
для набора табличных текстовых файлов (продемонстрированный здесь), электронные таблицы, изображения, база данных SQL (требуемый Database Toolbox™) или файлы последовательности Hadoop®.
Создайте datastore
для файла .csv
, содержащего данные авиакомпании. Обработайте значения 'NA'
как пропавших без вести так, чтобы datastore
заменил их на значения NaN
. Выберите переменные интереса и задайте тип категориальных данных для переменных Origin
и Dest
. Предварительно просмотрите содержимое.
ds = datastore('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
Длинные массивы подобны массивам MATLAB в оперативной памяти, за исключением того, что у них может быть любое количество строк. Длинные массивы могут содержать данные, которые являются числовыми, логическими, datetime, длительность, calendarDuration, категориальными, или строки. Кроме того, можно преобразовать любой массив в оперативной памяти в длинный массив. (Массив в оперативной памяти A
должен быть одним из поддерживаемых типов данных.)
Базовый класс длинного массива основан на типе datastore, который поддерживает его. Например, если datastore, ds
содержит табличные данные, то tall(ds)
возвращает tall table, содержащего данные.
tt = tall(ds)
tt = Mx6 tall table Year Month ArrDelay DepDelay Origin Dest ____ _____ ________ ________ ______ ____ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : : : : : : : : : : : :
Отображение указывает на базовый тип данных и включает первые несколько строк данных. Размер таблицы отображается как "Mx6", чтобы указать, что MATLAB еще не знает, сколько там строки данных.
Можно работать с длинными массивами и длинными таблицами подобным образом, в которых вы работаете с массивами MATLAB в оперативной памяти и таблицами.
Один важный аспект длинных массивов - то, что, когда вы работаете с ними, MATLAB сразу не выполняет большинство операций. Эти операции, кажется, выполняются быстро, потому что фактическое вычисление задерживается, пока вы в частности не запрашиваете вывод. Эта отсроченная оценка важна, потому что даже простая команда как size(X)
, выполняемый на длинном массиве с миллиардом строк, не является быстрым вычислением.
Когда вы работаете с длинными массивами, MATLAB отслеживает все операции, которые будут выполнены, и оптимизирует количество проходов через данные. Таким образом нормально работать с неоцененными длинными массивами, и запрос вывел только, когда вы требуете его. MATLAB не знает содержимое или размер неоцененных длинных массивов, пока вы не запрашиваете, чтобы массив был оценен и отображен.
Вычислите среднюю исходную задержку.
mDep = mean(tt.DepDelay,'omitnan')
mDep = tall double ?
Преимущество отсроченной оценки - то, что, когда время настает для MATLAB, чтобы выполнить вычисления, часто возможно объединить операции таким способом, которым минимизировано количество проходов через данные. Так, даже если вы выполняете много операций, MATLAB только делает дополнительные проходы через данные при необходимости.
Функция gather
обеспечивает оценку всех операций в очереди и загружает получившийся вывод в память назад. Поскольку gather
возвращает целый результат в MATLAB, необходимо убедиться, что результат уместится в памяти. Например, используйте gather
на длинных массивах, которые являются результатом функции, которая уменьшает размер длинного массива, такого как sum
, min
, mean
, и так далее.
Используйте gather
, чтобы вычислить, средний отъезд задерживают и загружают ответ в память. Это вычисление требует одного прохода через данные, но другие вычисления могут потребовать нескольких проходов через данные. MATLAB определяет оптимальное количество передач для вычисления и отображает эту информацию в командной строке.
mDep = gather(mDep)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.73 sec - Pass 2 of 2: Completed in 0.73 sec Evaluation completed in 1.7 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.61 sec Evaluation completed in 0.71 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);
Можно использовать типичные логические операции на длинных массивах, которые полезны для выбора соответствующих данных или удаления выбросов с логической индексацией. Логическое выражение создает высокий логический вектор, который затем используется, чтобы преобразовать в нижний индекс, идентифицируя строки, где условие верно.
Выберите только рейсы из Бостона путем сравнения элементов категориальной переменной 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
для длинных массивов возвращает главные строки k
в отсортированном порядке.
Вычислите лучшие 10 самых больших исходных задержек.
biggestDelays = topkrows(ttSubset,10,'DepDelay');
biggestDelays = gather(biggestDelays)
Evaluating tall expression using the Local MATLAB Session: Evaluation completed in 0.079 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
Графический вывод каждой точки в большом наборе данных не выполним. По этой причине визуализация длинных массивов включает сокращение количества выборки использования точек данных или раскладывания.
Визуализируйте количество рейсов в год с гистограммой. Проход через данные функций визуализации и сразу оценивает решение, когда вы вызываете их, таким образом, gather
не требуется.
histogram(ttSubset.Year,'BinMethod','integers')
Evaluating tall expression using the Local MATLAB Session: Evaluation completed in 0.41 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.41 sec - Pass 2 of 2: Completed in 0.65 sec Evaluation completed in 1.2 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.54 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.81 sec Evaluation completed in 0.85 sec
colorbar xlabel('Year') ylabel('Month') title('Airline Flights by Month and Year, 1987 - 2008')
Можно выполнить более сложный статистический анализ длинных массивов, включая вычисление прогнозной аналитики и выполнение машинного обучения, с помощью функций в Statistics and Machine Learning Toolbox™.
Для получения дополнительной информации смотрите Поддержку Длинного массива, Указания по применению и Ограничения (Statistics and Machine Learning Toolbox).
Ключевая возможность длинных массивов в MATLAB является возможностью соединения на большие платформы данных, такие как вычислительные кластеры и Apache Spark™.
Этот пример только царапает поверхность того, что возможно с длинными массивами для больших данных. Смотрите Расширение длинных массивов с помощью других продуктов для получения дополнительной информации об использовании:
Statistics and Machine Learning Toolbox™
Database Toolbox™
Parallel Computing Toolbox™
MATLAB® Parallel Server™
MATLAB Compiler™