主要内容

用于内存不足数据的高数组

高数组用于处理由数据存储.数据存储使您能够处理小块中的大数据集,这些小块可以单独装入内存中,而不是一次性将整个数据集装入内存中。高数组扩展了此功能,使您能够使用常用函数处理内存不足的数据。

什么是高数组?

由于数据不是一次性加载到内存中,所以高数组在第一个维度上可以任意大(也就是说,它们可以有任意数量的行)。与编写考虑到庞大数据量的特殊代码(如MapReduce等技术)不同,高数组让您以一种与使用内存中的MATLAB类似的方式直观地处理大型数据集®数组。许多核心操作符和函数对高数组的处理方式与对内存中数组的处理方式相同。MATLAB一次处理小块的数据,在后台处理所有的数据分块和处理,这样常见的表达式,如A + B,与大数据集打交道。

高数组的好处

与内存中数组不同,高数组通常不进行求值,直到请求使用收集函数。这延迟评价允许您快速处理大型数据集。当您最终请求使用收集, MATLAB结合排队计算在可能的情况下,并获得通过数据的最小次数。数据传递的次数对执行时间有很大影响,因此建议只在必要时请求输出。

请注意

收集返回作为内存中的MATLAB数组的结果,适用标准内存考虑因素。返回的结果可能会耗尽MATLAB的内存收集太大。

创建高表

高表类似于内存中的MATLAB表,只是它们可以有任意数量的行。要从大型数据集创建高表,首先需要为数据创建一个数据存储。如果数据存储ds那么,包含表格数据高(ds)返回包含数据的高程表或高程时间表。看到数据存储有关创建数据存储的详细信息。

创建一个指向航空公司航班数据表格文件的电子表格数据存储。对于包含文件集合的文件夹,可以指定整个文件夹位置,或使用通配符,‘* . csv‘,以在数据存储中包含具有相同文件扩展名的多个文件。通过处理清理数据“NA”值作为缺失的数据,因此tabularTextDatastore取代他们值。另外,将一些文本变量的格式设置为% stabularTextDatastore将它们读取为字符向量的单元格数组。

ds = tabularTextDatastore (“airlinesmall.csv”);ds。TreatAsMissing =“NA”;ds.SelectedFormats {strcmp (ds.SelectedVariableNames,“TailNum”)} =' % s ';ds.SelectedFormats {strcmp (ds.SelectedVariableNames,“CancellationCode”)} =' % s '

从数据存储创建一个高表。当您在这个高表上执行计算时,底层数据存储将读取数据块并将它们传递给高表进行处理。数据存储和高表都不保留任何底层数据。

tt =高(ds)
tt = M×29日高表年月DayofMonth DayOfWeek DepTime CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime通话时间ArrDelay DepDelay起源桌子距离TaxiIn TaxiOut取消CancellationCode转移CarrierDelay WeatherDelay NASDelay SecurityDelay LateAircraftDelay  ____ _____ __________ _________ _______ __________ _______ __________ _____________ _________ _______ _________________ ______________ _______ ________ ________ ______ _____________ ______ _______ _________ ________________ ________ ____________ ____________ ________ _____________ _________________ 1987 21 642 630 735 727“PS”1503“NA”53 57南8 12“宽松”SJC 308年南南“NA”0南南南南南26 1 1021 1020 1124 1987 1116 1550“NA”63“PS”56南8 296南南“SJC”“钻”0“NA”南南南南南1987年10 23 5 2055 2035 2218 2157“PS”1589“NA”83 82南21 20“圣”SMF 480年南南“NA”0南南南南南1987年10 23 5 1332 1320 14311418“PS”1655“NA”59 58南13 12“钻”SJC 296年南南“NA”0南南南南南22 629 1987 630 746 742“PS”1702“NA”77 72南4 373南南SMF的“宽松”0“NA”南南南南南1987 10 28 3 1446 1343 1547 1448“PS”1729“NA”61 65南59 63“宽松”SJC 308年南南“NA”0南南南南南1987 10 8 4 928 930 1052 1049“PS”1763“NA”84 79南3 2“圣”“旧金山”447年南南“NA”0南南南南南1987 10 10 6 859 900 1134 1123“PS”1800“NA”155 143南11 1“海”'LAX' 954 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :

显示显示行数,,目前未知。MATLAB显示了一些行和垂直椭圆指示高表中存在更多当前未显示的行。

创造高的时间表

如果您正在处理的数据与每一行数据都有关联的时间,那么您可以使用一个高时间表来处理数据。有关创建高时间表的信息,请参见扩展功能(时间表

在这种情况下,是高桌子tt有与每一行相关联的时间,但是它们被分解为几个表变量,例如一年DayofMonth,等等。将所有这些datetime信息片段组合成一个新的高datetime变量日期,是根据出发时间计算的DepTime.然后,用日期就像行乘以。自日期表中唯一的datetime变量是table2timetable函数自动将其用于行时间。

小时= (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 = 21 M×高时间表日期UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime通话时间ArrDelay DepDelay起源桌子距离TaxiIn TaxiOut取消CancellationCode转移CarrierDelay WeatherDelay NASDelay SecurityDelay LateAircraftDelay  ____________________ _____________ _________ _______ _________________ ______________ _______ ________ ________ ______ _____ ________ ______ _______ _________ ________________ ________ ____________ ____________ ________ ______________________________ 21 - 10月- 1987 06:42:00“PS”1503“NA”53 57南8 12“宽松”SJC 308年南南“NA”0南南南南南26 - 10月- 1987 10:21:00“PS”1550“NA”63 56南8 296南南“SJC”“钻”0“NA”南南南南南1987年- 10月23日20:55:00“PS”1589“NA”83 82南21 20“圣”SMF 480年南南“NA”0南南南南南1987年- 10月23日13:32:00“PS”1655“NA”59 58南十三12“钻”SJC 296年南南“NA”0南南南南南22 - 10月- 1987 06:29:00“PS”1702“NA”77 72南4 1 SMF的“宽松”373年南南“NA”0南南南南南1987年- 10月28日14:46:00“PS”1729“NA”61 65南59 63“宽松”SJC 308年南南“NA”0南南南南南08 - 10月- 1987年09:28:00“PS”1763“NA”84 79南3 2“圣”“旧金山”447年南南“NA”0南南南南南10 - 10月- 1987年08:59:00“PS”1800“NA”155 143南11 1“海”“宽松”954南南0 0南南南南南“NA”  : : : : : : : : : : : : : : : : : : : : : : : :

创造高的数组

当您从高表或高时间表中提取变量时,结果是适当的底层数据类型的高数组。高数组可以是数字数组、逻辑数组、日期时间数组、持续时间数组、日历持续时间数组、类别数组、字符串数组或单元格数组。此外,您还可以转换内存中的数组一个排成一排tA =高(A).内存中的数组一个必须具有受支持的数据类型之一。

提取到达延迟ArrDelay从高高的时间表中TT.这将创建一个新的高数组变量,其底层数据类型为double。

一个= TT。一个rrDelay
a = M×1高双列向量8 8 21 13 4 59 3 11::

classUnderlying而且isaUnderlying函数对于确定高数组的底层数据类型非常有用。

延迟评价

高数组的一个重要方面是,在使用它们时,大多数操作不会立即执行。这些操作看起来执行得很快,因为实际的计算被延迟,直到您特别请求执行计算。方法可以触发对高数组的求值收集函数(将结果存入内存)或函数(将结果写入磁盘)。这种延迟计算非常重要,因为即使是像大小(X)在具有10亿行的高数组上执行不是一个快速计算。

当你使用高数组时,MATLAB会跟踪所有要执行的操作。类请求输出时所需的数据的传递次数将使用此信息进行优化收集函数。因此,通常使用未求值的高数组并仅在需要时请求输出。有关更多信息,请参见高数组的延迟求值

计算到达延误的平均值和标准差。使用这些值构造距离平均值一个标准偏差内的延迟的上下限阈值。注意,每个操作的结果都表明还没有计算数组。

m =意味着(,“omitnan”
M =高双?预览延期。学习更多的知识。
s =性病(,“omitnan”
S =高?预览延期。学习更多的知识。
One_sigma_bounds = [m-s m m+s]
one_sigma_bounds = M×N×……高大的数组???...???...? ? ? ... : : : : : : Preview deferred. Learn more.

评估与收集

延迟计算的好处是,当MATLAB需要执行计算时,通常有可能以这样一种方式组合操作,使通过数据的次数最小化。因此,即使您执行了许多操作,MATLAB也只在绝对必要的时候对数据进行额外的传递。

收集函数强制计算所有排队操作,并将结果输出放入内存。因为这个原因,你可以想到收集作为高数组和内存数组之间的桥梁。例如,你无法控制如果循环使用高逻辑数组,但一旦数组用收集它成为一个可以在这些上下文中使用的内存逻辑数组。

收集在MATLAB中返回整个结果,你应该确保结果将适合内存。

使用收集计算one_sigma_bounds然后把结果记在记忆里。在这种情况下,one_sigma_bounds需要几个操作来计算,但MATLAB将这些操作合并为一次数据传递。由于本例中的数据很小,收集快速执行。但是,随着数据大小的增加,消除数据传递变得更有价值。

sig1 =收集(one_sigma_bounds)
通过1 / 1:在1.5秒内完成计算在1.8秒内完成sig1 = -23.4572 7.1201 37.6975

可以指定多个输入和输出收集如果你想一次计算几个高数组。这种技术比调用要快收集很多次了。例如,计算最小和最大到达延迟。单独计算时,每个值都需要遍历数据,以计算总共两次遍历。然而,同时计算两个值只需要一次数据遍历。

[max_delay, min_delay] = gather(max(a),min(a))
通过1 / 1:在1.1秒内完成计算在1.1秒内完成max_delay = 1014 min_delay = -64

这些结果表明,大多数航班平均晚点7分钟左右。但对于航班延误37分钟或提前23分钟,都在一个标准偏差范围内。数据集中最快的航班提前一个小时到达,最晚的航班延误了好几个小时。

保存、加载和检查点高数组

保存函数保存状态,但不复制任何数据。由此产生的.mat文件通常很小。但是,原始数据文件必须在相同的位置可用,以便随后使用负载

函数生成数据的副本,并将副本保存为文件的集合,这可能会消耗大量的磁盘空间。执行tall数组上的所有挂起操作,以便在写入之前计算值。一次复制数据,它独立于原始数据。因此,即使原始数据不再可用,也可以从写入的文件重新创建tall数组。

通过创建一个指向文件写入位置的新数据存储,可以从写入的文件重新创建tall数组。此功能使您能够创建检查点快照的高数组数据。创建检查点是一种保存数据预处理结果的好方法,这样数据的形式可以更有效地加载。

如果你有一个高数组助教,然后你就可以把它写入文件夹位置使用命令:

写(位置,TA);

后来,重建助教从写好的文件中,使用以下命令:

ds =数据存储(位置);TA =高(ds);

此外,您可以使用函数触发高数组的求值并将结果写入磁盘。这个用的类似于收集然而,不会将任何结果带入内存。

支持功能

大多数核心函数使用高数组的方式与使用内存中数组的方式相同。然而,在某些情况下,函数处理高数组的方式是特殊的或有限制的。控件中的函数的参考页面底部,可以判断函数是否支持高数组,以及它是否有任何限制扩展功能部分(有关示例,请参见。filloutliers).

有关支持高数组的所有MATLAB函数的筛选列表,请参见函数列表(高数组)

多个工具箱还支持高数组,使您能够编写机器学习算法、部署独立的应用程序,并在并行或集群上运行计算。有关更多信息,请参见用其他产品扩展高阵列2022世界杯八强谁会赢?

另请参阅

||||

相关的话题

Baidu
map