内存不足数据的长数组

高大阵列用于工作与由一个支持的存储器外的数据数据存储。数据存储使您能够在单独地装入内存小块大型数据集的工作,而不是一次加载整个数据集到内存中。高大的阵列扩展这一功能,使您能够使用常用功能外内存数据的工作。

什么是高数组?

由于数据不会一次加载到内存中,所以第一个维度中的高数组可以是任意大的(也就是说,它们可以有任意数量的行)。不需要编写专门的代码来考虑数据的巨大规模,比如使用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 ';

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

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 10 21 3 642 630 735 727 'PS' 1503 'NA' 53 57的NaN 8 12 'LAX' 'SJC' 308楠楠0 'NA' 0为NaN楠楠楠楠1987 10 26 1 1021 1020 1124 1116 'PS' 1550 'NA' 63 56 NaN的8 1 'SJC' 'BUR' 296楠楠0 'NA' 0楠楠楠楠的NaN 1987 10 23 5 2055 2035 22182157 'PS' 1589 'NA' 83 82 21的NaN 20 'SAN' 'SMF' 480楠楠0 'NA' 0楠楠楠楠的NaN 1987 10 23 5 1332 1320 1431 1418'PS' 1655 'NA' 59 58的NaN 13 12 'BUR' 'SJC' 296楠楠0 'NA' 0楠楠楠楠的NaN 1987 10 22 4 629 630 746 742 'PS' 1702 'NA' 77 72的NaN 4-1 'SMF' 'LAX' 373楠楠0 'NA' 0楠楠楠楠的NaN 1987 10 28 3 1446 1343 1547 1448 'PS' 1729 'NA' 61 65 59的NaN 63 'LAX' 'SJC' 308楠楠0 'NA' 0楠楠楠楠的NaN 1987 10 8 4 928 930 1052 1049 'PS' 1763 'NA' 84 79 NaN 3的-2 'SAN' 'SFO' 447楠楠0 'NA' 0楠楠楠楠的NaN1987年10 10 6 859 900 1134 1123 'PS' 1800 'NA' 155 143的NaN 11 -1 'SEA' 'LAX' 954楠楠0 'NA' 0楠楠楠楠楠::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

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

创造高的时间表

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

在这种情况下,高大的表tt与每行关联的时间,但它们被分解为几个表变量,如一年,,DayofMonth, 等等。结合所有这些作品的日期时间信息到一个单一的新高日期时间变量日期,这是根据出发时间计算的DepTime。然后,创建一个高的时间表使用日期随着行乘以。自日期是仅在表的日期时间的变量,该table2timetable功能会自动将其用于该行倍。

小时=(tt.DepTime  -  MOD(tt.DepTime,100))/ 100;分钟= MOD(tt.DepTime,100);tt.Dates =日期时间(tt.Year,tt.Month,tt.DayofMonth,小时,分钟,0);TT(:,1:8)= [];TT = table2timetable(TT)
TT = M×21个高大时间表日期UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime通话时间ArrDelay DepDelay产地目标距离TaxiIn TaxiOut取消CancellationCode改行CarrierDelay WeatherDelay NASDelay SecurityDelay LateAircraftDelay ____________________ _____________ _________ _______ _________________ ______________ _______ ________ ________ ______ _____ ________ ______ _______ _________ ________________ ________ ____________ ____________ ________ ______________________________ 21-OCT-1987六时42分○○秒 'PS' 1503 'NA' 53 57 8的NaN 12 'LAX' 'SJC' 308楠楠0 'NA' 0楠楠楠楠NaN的26-OCT-1987 10时21分:00 'PS' 1550 'NA' 63 56 8的NaN 1 'SJC' 'BUR' 296楠楠0 'NA' 0楠楠楠楠NaN的23-OCT-1987二十点55分○○秒 'PS' 1589 'NA'83 82 21的NaN 20 'SAN' 'SMF' 480楠楠0 'NA' 0楠楠楠楠NaN的23-OCT-1987十三时32分00秒 'PS' 1655 'NA' 59 58 13的NaN 12 'BUR''SJC” 296楠楠0 'NA' 0楠楠楠楠NaN的22-OCT-1987六时29分00秒 'PS' 1702 'NA' 77 72的NaN 4 -1 'SMF' 'LAX' 373的NaÑ的NaN 0 'NA' 0楠楠楠楠NaN的28-OCT-1987 14点46分○○秒 'PS' 1729 'NA' 61 65 59的NaN 63 'LAX' 'SJC' 308楠楠0 'NA' 0楠楠楠楠NaN的08-OCT-1987九时28分00秒 'PS' 1763 'NA' 84 79 NaN 3的-2 'SAN' 'SFO' 447楠楠0 'NA' 0楠楠楠楠NaN的10-OCT-1987八时59分00秒 'PS' 1800 'NA' 155 143的NaN 11 -1 'SEA' 'LAX' 954楠楠0 'NA' 0楠楠楠楠楠::::::::::::::::::::::::

创造高的数组

当您提取从一个高大的表或高大时间表的变量,其结果是适当的基础数据类型的一个高大的阵列。一个高大的阵列可以是数字的,逻辑的,日期时间,持续时间,日历时间,分类,字符串或单元阵列。此外,您还可以将内存中的数组一个排成一长列tA =高(A)。在内存中的阵列一个必须有支持的数据类型之一。万博1manbetx

提取到达延迟ArrDelay从长长的时间表中TT。这将创建一个新的具有底层数据类型double的tall数组变量。

A = TT.ArrDelay
A = M×1个高大双列向量8 8 21 13 4 59 3 11:

classUnderlyingisaUnderlying函数对于确定tall数组的底层数据类型很有用。

延迟评价

高大的阵列中的一个重要方面是,当你与他们的工作,大部分操作都不会立即执行。这些操作出现快速执行,因为实际的计算被推迟,直到你明确要求的计算来进行。你可以触发一个高大的阵列的评价与任收集函数(将结果存入内存)或函数(将结果写入磁盘)。这种延迟计算非常重要,因为即使是一个简单的命令,比如大小(X)在一个有10亿行的高数组上执行不是一个快速的计算。

当你与高大阵列工作,MATLAB跟踪所有的操作来进行的。然后,该信息被用于通过将被要求的数据时,请求输出与优化遍数收集函数。因此,通常使用未计算的高数组,仅在需要时才请求输出。有关更多信息,请参见高数组的延迟计算

计算到达延迟的平均值和标准偏差。使用这些值来构建的上部和下部阈值是平均值的一个标准偏差之内的延迟。请注意,每个操作的结果表明,该阵列还没有被计算。

M =平均值(一,“omitnan”)
m =高双份?预览延期。学习更多的知识。
s =性病(,“omitnan”)
S =高?预览延期。学习更多的知识。
one_sigma_bounds = [m-s m m+s]
one_sigma_bounds = M×N×...高大阵列???...???...???...::::::预览推迟。 Learn more.

评估与收集

延迟计算的好处在于,当MATLAB需要执行计算时,通常可以将操作组合在一起,使通过数据的次数最小化。因此,即使您执行许多操作,MATLAB也只在绝对必要时对数据进行额外的遍历。

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

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

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

sig1 =收集(one_sigma_bounds)
使用本地MATLAB会话对tall表达式进行求值:-通过1 / 1:在1.5秒内完成求值,在1.8秒内完成求值= -23.4572 7.1201 37.6975

您可以指定多个输入和输出收集如果你想一次计算几个高数组。这种方法比打电话快收集很多次了。例如,计算最小和最大到达延迟。分别计算后,每个值需要通过一次数据来计算总共两次。然而,同时计算两个值只需要一次数据传递。

[max_delay, min_delay] =采集(max(a),min(a))
使用本地MATLAB会话对tall表达式求值:-通过1 / 1:在1.1秒内完成求值,在1.1秒内完成max_delay = 1014 min_delay = -64

这些结果表明,大多数航班平均迟到7分钟左右。但是,航班晚到37分钟或早到23分钟都在一个标准偏差之内。数据集中最快的航班大约提前一小时到达,而最近的航班则延误了好几个小时。

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

保存函数保存状态一个高大的阵列,但不复制的任何数据。所结果的.mat文件通常很小。但是,原始数据文件必须在相同的位置可用,以便随后使用负载

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

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

如果你有一个高数组助教,那么你可以将它写入该文件夹位置使用命令:

写(位置,TA);

后来,重建助教从书面文件,使用命令:

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

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

万博1manbetx支持功能

大多数核心功能的工作方式相同高大的数组,因为它们在存储器阵列做。然而,在某些情况下,一个功能与高大的阵列工作方式是特殊或有一定的局限性。你可以告诉函数是否支持高大阵列,如果有任何限制,通过在参考页的底万博1manbetx部寻找的功能扩展功能节(有关示例,请参阅filloutliers)。

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

几个工具箱还支持高数组,使您能够编写机器学万博1manbetx习算法、部署独立应用程序、并行或在集群上运行计算。有关更多信息,请参见用其他产品扩展高阵列s manbetx 845

另请参阅

||||

相关话题