MATLAB的博客

实用的建议在前沿的人

添加两行MATLAB代码处理大数据

今天的嘉宾是哈拉尔德Brunnhofer, MathWorks校长培训工程师。上的成千上万的用户开始使用MATLAB或MATLAB技能更上一层楼,他的内容开发人员 加速和并行MATLAB代码 用MATLAB处理大数据 培训课程。
在前面的帖子,迈克了概述MATLAB的高性能计算(HPC)和大数据的数据类型。今天,我将向您展示如何使用高数组从小型到大型数据用最少的代码更改。
“大数据”是越来越相关的各种行业和应用程序。对于我们的目的,这是(远)的数据太大,适合一台计算机的内存:几十gb,可能tb甚至pb(= 1024字节)的数据。所以你会做什么如果你内存不足错误或非常清楚,这些在你尝试之前你会得到?

大型数据集的一些一般性的建议

甚至在数据被“大”,它可能会感兴趣的节省内存,时间,或两者兼而有之
  • 只进口所需要的数据:如果你有表格数据与许多列但只需要一些工作,这是一个浪费进口不需要的列。对于数据存储,如下所示,您可以使用SelectedVariableNames选择您想要导入的变量。
  • 仔细选择数据类型:如果你有数值的数据可以存储在单一或整数数据类型和操作,这可以节省一些内存。如果文本数据只能用少量的值大小的数据相比,分类数组也会节省内存。对于数据存储,可以改变一个变量的数据类型使用TextScanFormatsSelectedFormats所示的属性generateBigData这个脚本的底部的函数。
  • 避免不必要的副本的数据:什么是消费两次一个大变量的内存?两个变量的大小相同。我知道这听起来很简单,但是它很容易逃避训练人的思维。就地操作是一种先进的方式避免变量得到复制。

数据存储:对于大型和小型数据好

如果你使用过. csv文件或其他表格文本文件之前,您已经使用函数readtable,readmatrix以上等功能textscancsvread。大数据的工作流,另一方面,从的概念开始数据存储所以我们会通过使用一个数据存储在一个小的数据情况。
我们需要一个数据文件下面的例子。的airlinesmall.csv文件附带MATLAB“只有”100000行数据,所以它将轻松适应现代计算机的内存。更多如果我们只有导入列的数据集,我们真正需要的。我们的目标是确定的平均延迟飞行,这取决于运营商。下面的例子写,以适应更大的数据集,。

设置数据存储

一个数据存储是一个MATLAB对象,指的是一个文件,或者在使用吗*作为一个通配符,一组文件。这些文件可以存储在磁盘或远程,如Amazon S3, Azure Blob存储,或Hadoop。如果远程数据存储,强烈建议在环境处理数据存储避免下载数据。
数据存储不直接读取数据。相反,它包含哪些文件信息阅读和如何阅读的时候要求。这是非常有用的在反复阅读大量的装货文件而不是全部。MATLAB数据存储了各种文件格式,包括文本,电子表格,图像,拼花,甚至自定义格式文件。类型的数据存储的完整列表,请参阅文档可用数据存储
如果数据存储指的是一组文件,他们需要一个类似的结构。对于表格文本文件或电子表格,这意味着相同的列标题。
名称-值对可以用来微调设置创建数据存储时,你可以使用点索引设置或获取的属性数据存储之后创建的。
格式紧凑的
ds =数据存储(“airlinesmall.csv”TreatAsMissing =“NA”分隔符=”、“);
ds。SelectedVariableNames = [“UniqueCarrier”,“ArrDelay”];
ds。SelectedFormats {1} =“% C”;

导入并检查数据

命令将导入的数据块。表格文本数据存储的命令返回一个表。进口的行数是确定的ReadSize财产。下一个电话将简历上一个离开的地方。
如果所有的数据符合内存,你可以使用readall命令来导入所有数据与一个命令即使数据分布在多个文件。
ds。ReadSize =“文件”;%,我们可以读取整个文件
data =阅读(ds);
结果是一个表有两列,承运人和每个航班的延误。让我们看一些行:
disp(数据(10:20,:))
UniqueCarrier ArrDelay _________________ ________p 2 p 16 PS 3 PS 39 TW 57 TW 0 TW -14太瓦15 TW 8太瓦11 TW 3
你可以找到一个载波编码和航空公司列表在这里

执行分析

groupsummary命令是一个相当新的团体和方便的方式来有效地分析数据。你可以通过平均延误。
delayStats = groupsummary(数据,“UniqueCarrier”,“的意思是”);
delayStats = sortrows (delayStats,“mean_ArrDelay”)
delayStats =29日×3表
UniqueCarrier GroupCount mean_ArrDelay
1 273年 -1.5387
2 毫升(1) 69年 0.1594
3 AQ 154年 1.0065
4 TZ 216年 1.9070
5 9 e 521年 5.3669
6 巴勒斯坦权力机构(1) 318年 5.3738
7 PS 83年 5.3902
8 西北 10349年 5.4265
9 WN 15931年 5.4581
10 面向对象 3090年 5.8618
11 我们 13997年 6.8027
12 AA 14930年 6.9598
13 有限公司 8138年 7.0480
14 太瓦 3805年 7.4110
现在我们得到我们想要的结果
disp (“航空公司”+ +字符串(delayStats.UniqueCarrier (1))“有最小的平均延迟”+
delayStats.mean_ArrDelay (1) +“分钟”。+换行符+“航空公司”+
字符串(delayStats.UniqueCarrier(结束))+“最大的平均延迟”+ + delayStats.mean_ArrDelay(结束)“分钟”。)
航空公司哈有最小的平均延迟到-1.5387分钟。航空公司青年志愿有最大的平均延误为12.3761分钟。

高大的数组:一个简单的懒惰的评价框架来处理大数据

当我们只有少量的数据存储中的数据,我们使用
data =阅读(ds);
获取整个数据和我们处理一切在内存中。当我们的数据太大记忆,我们可以循环块和获得每个块的部分结果,但这可能会很麻烦甚至相对简单的像我们这样的设置。
MATLAB高大的数组扩展内存,通常基于工作流的数据并不适合在内存中。因此,我们可以发展我们的分析代码基于内存中的表并使用MATLAB分析代码与很少或没有调整对整个数据集,否则无法装入内存。
在创建数组实现,高从数据存储和使用一个“懒惰的评价”方法进行数据处理。与懒惰的评估、高数组首先收集分析数据上的操作而不是每次调用后直接执行他们。当请求,MATLAB决定最好的方式来运行这些操作,读取数据块从底层数据存储,应用业务,并提供最终结果给用户。

生成一些大型试验的数据

对于这篇文章的目的,我们将生成一个大数据集的小数据集通过创建多个副本和添加一些随机变化到达延误使用一个函数incuded年底这个脚本。为了理智和备用硬盘,在这个例子中,我们将生成50个文件大约12 Mb。工作流你即将看到也会工作的很好,如果你有一个甚至50 30 gb的文件。会把长(多),所以我们将探讨并行计算选项。
generateBigData (50,50)%这个脚本的底部使用函数来生成大约600 MB的数据

设置数据存储

我们解释了数据存储与小样本数据集的概念。现在,而不是小的数据集,我们将点数据存储的完整集合datafiles使用通配符(*)。
“大数据”版本的唯一区别,直到现在我们看到的是文件名。
ds =数据存储(“airlinebig * . csv”TreatAsMissing =“NA”分隔符=”、“);%只调整位置
ds。SelectedVariableNames = [“UniqueCarrier”,“ArrDelay”];
% ds。SelectedFormats {1} = ' % C ';%这将导致额外的传递,从而执行时间更长
% ds。ReadSize = "文件";%我们不想依赖甚至单个文件的数据放入内存

建立并行资源

如果并行计算工具可用,多核可用于加速执行。如果你没有访问并行计算工具箱,评论这一节,您仍然能够运行的例子。了解更多关于并行池和线程和基于过程的并行池之间的区别,看到代码运行在并行池在线程之间进行选择和基于流程的环境页的文档。最重要的是,你可以在一个集群上运行计算或云,包括高性能计算环境,而不是在你的桌面上。这将需要MATLAB并行服务器
如果isempty (gcp (“nocreate”))
parpool (“线程”)
结束
开始平行池(parpool)使用“线程”概要文件…连接到平行池(工人数量:4)。ans = ThreadPool属性:NumWorkers: 4忙:假的

导入数据

命令构造一个高大的数组从数据存储中。适合个子高的数组,MATLAB只会开始读数据请求时使用收集命令或其他命令,如情节柱状图,引发高变量的读取操作。
data =高(ds)%的第一个真正的改变以前的代码
data = M×2高表UniqueCarrier ArrDelay _________________ ________11 {“PS”} {“PS”} 17 10 {“PS”} {“PS”} 17 6 {“PS”} {“PS”} 52 {“PS”} 1 {“PS”} 13::::
目前,我们只知道,我们将会有一个高大的表有两个变量命名UniqueCarrierArrDelay,但我们甚至不看到它会有多少行,因为这需要阅读所有的数据。

执行分析

delayStats = groupsummary(数据,“UniqueCarrier”,“的意思是”)
delayStats = M×3高表UniqueCarrier GroupCount mean_ArrDelay _________________ __________ _________________吗?吗?吗?吗?吗?吗?吗?吗?吗?::::::预览延期。 Learn more.
这一次,我们只知道,我们将会有一个高大的表有三个变量命名UniqueCarrier,GroupCount,mean_ArrDelay,我们还没有看到它会有多少行,因为需要阅读所有的数据。
delayStats = sortrows (delayStats,“mean_ArrDelay”)
delayStats = M×3高表UniqueCarrier GroupCount mean_ArrDelay _________________ __________ _________________吗?吗?吗?吗?吗?吗?吗?吗?吗?::::::预览延期。 Learn more.
就像之前,实际的分析是延迟的。

得到结果后

让我们引发的实际处理数据。因为现在进口块的数据块和可能有相当数量的块,这可能需要一段时间:
delayStats =收集(delayStats);%之前使用的其他真正改变代码
评估高表达式使用并行池:通过1 2:在9秒-通过2完成2:在13秒评估完成在25秒完成
报告结果:
disp (“航空公司”+ +字符串(delayStats.UniqueCarrier (1))“有最小的平均延迟”
+ delayStats.mean_ArrDelay (1) +“分钟”。+换行符+
“航空公司”+字符串(delayStats.UniqueCarrier(结束))+“最大的平均延迟”
+ + delayStats.mean_ArrDelay(结束)“分钟”。)
航空公司哈有最小的平均延迟到-1.417分钟。航空公司青年志愿有最大的平均延误为12.3736分钟。
因为我们的大数据集是复制原始数据集的小变化,我们的结果与之前。

一个稍微不同的问题

当考虑守时统计,人们经常考虑延误的航班的百分比小于一定的时间。
下列变量允许您选择延迟是可以接受的。
acceptableDelay =5
acceptableDelay = 5
为此我们需要一个函数来计算满足延迟航班的百分比标准。我们可以把这个函数写成一行并将其传递给groupsummary作为一个匿名函数
fcn = @ x (x)和(< = acceptableDelay) /元素个数(x) * 100;
除此之外,工作流之前我们所做的几乎是相同的:
ds = tabularTextDatastore (“airlinebig * . csv”TreatAsMissing =“NA”分隔符=”、“);
ds。SelectedVariableNames = [“UniqueCarrier”,“ArrDelay”];
data =高(ds);
delayStats = groupsummary(数据,“UniqueCarrier”,fcn);
delayStats.Properties。VariableNames {3} =“守时”;%变量重命名数据(可选)
delayStats =收集(sortrows (delayStats“守时”,“下”));
评估高表达式使用并行池:通过1 2:在8.9秒完成,通过2 2:在22秒评价完成33秒完成
报告结果:
disp (“航空公司”+ +字符串(delayStats.UniqueCarrier (1))“准时率最高”
+ delayStats.Punctuality (1) +“%”。+换行符+“航空公司”+
字符串(delayStats.UniqueCarrier(结束))+“守时最低速度”+ + delayStats.Punctuality(结束)“%”。)
航空公司HA准时率最高为81.3187%。航空公司π准时率最低为47.302%。

删除测试大数据(可选)

可选地,删除大文件我们已经创建了模拟大数据。
deleteTestFiles =真正的;
如果deleteTestFiles
删除(“airlinebig * . csv”)
结束

总结和资源

在这个例子中,我们转换工作罚款数据的应用程序,适合内存来处理大数据的应用程序。所有我们要做的就是使用而不是readall并添加一个收集命令。对于这个示例,使用的命令和语法没有改变。
请注意,并不是所有的航运与MATLAB工具箱的函数都是支持高数组。万博1manbetx查看所有的功能列表,支持高数组万博1manbetx在这里。在这个列表中,图标表明高层数组不同于行为行为的变量,这些变量在内存中。点击图标查看细节。
资源,学习更多关于高数组:

万博1manbetx支持功能

generateBigData创建一个合成大数据集创建的多个副本airlinesmall.csv文件附带MATLAB和添加一些随机变化的延迟。这个函数不优化性能。
输入:
  • numBlocks原始数据复制的次数来创建一个(非常)大文件
  • numFiles副本的数量要创建(相当)大文件
函数generateBigData (numBlocks numFiles)
rng (“默认”)
ds =数据存储(“airlinesmall.csv”TreatAsMissing =“NA”分隔符=”、“);
ds。TextscanFormats([11日23])= {' % s '};
data = readall (ds);
newData =数据;
删除(“airlinebig * . csv”)
h = waitbar (0,“0”+ numBlocks +“块”。);
c = onCleanup(@()关闭(h));
k = 1: numBlocks
newData。ArrDelay= data.ArrDelay + round(5*randn(size(data.ArrDelay)));
writetable (newData“airlinebig”+ k +. csv”,“写模式”,“添加”)
waitbar (k / numFiles h, k +“的”+ numBlocks +“块”。);
结束
h = waitbar (0,“0”+ numFiles +“创建副本”。);
c = onCleanup(@()关闭(h));
k = 2: numFiles
拷贝文件(“airlinebig1.csv”,“airlinebig”+ k +. csv”);
waitbar (k / numFiles h, k +“的”+ numFiles +“创建副本”。);
结束
结束
|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。