找回密码
 注册
关于网站域名变更的通知
查看: 438|回复: 1
打印 上一主题 下一主题

大文件和大数据

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-27 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
大文件和大型数据集的访问和处理
大数据集可以是大文件,也可以是许多小文件的集合。大数据集通常受到内存限制而无法处理的数据,也可能需要很长时间才能处理的数据。没有单一的方法来处理大型数据集,因此Matlab®提供了许多工具。
使用DATASTORE函数和对象来逐步访问文本文件、Mat文件或序列文件集合中的数据。使用while循环处理数据存储中的数据,对数据存储进行分区以进行并行处理,或者使用MapReduce编程技术。使用MAT-files对象来访问或保存Mat文件中的大变量部分,而不必将完整变量加载到内存中。将二进制文件数据映射到内存,以便更快地访问。
Datastore
读取大数据集
MapReduce
用于分析不适合于内存的数据集的编程技术
大MAT-files
访问和更改变量而不加载到内存中
内存映射
将文件数据映射到内存以便更快访问
一、Datastore
DATASTORE函数为无法加载到内存中的大数据集创建一个数据存储仓库。DATASORE允许您读取和处理多个文件作为单个实体。如果文件太大,无法放入内存,则可以管理数据的逐步导入,或者使用数据存储作为mapreduce的输入以进行进一步处理。
DATASTORE是用于读取单个文件或文件数据集合的对象。DATASTORE作为具有相同结构和格式数据的存储库。例如,DATASTORE中的每个文件必须包含以相同顺序出现的相同类型(例如数字或文本)的数据,并且由相同的分隔符分隔。
如下情况使用Datastore:
集合中的每个文件可能太大,无法存储在内存中。DATASORE允许您读取和分析每个文件中的数据,这些小部分满足内存。
集合中的文件具有任意名称。DATASORE作为一个或多个文件夹中文件的仓库。文件不需要有连续的名称。
" e, N$ t* V& h- E' N1 w
您可以为该表中的数据类型创建DATASORE。每种类型的数据都由不同类型的DATASORE支持。不同类型的DATASORE支持与它们相应的属性。
数据或文件类型                 
( Y$ T. ?9 _9 E5 s
Datastore   类型            
面向列数据的文本文件, 包括CSV 文件
6 Q* j$ I: z. o9 _* E& X% G( G; p( |
TabularTextDatastore
8 N1 d8 v* s8 A7 h# I
* v+ U  ]4 f( V" Y- I* L  |" B. G
) Z+ L. a1 ~7 z9 h
图像文件,包括imread支持的格式,如JPEG和PNG
6 {! i  R( `* y# f6 Z, l
ImageDatastore

# `; T7 }) p. |3 ^1 O3 Q* }5 i1 E+ D& a

0 h7 h  Z) U3 Z6 m" B) d
键值对数据,它是MapReduce的输入或输出
% p4 S4 \6 \4 p
KeyValueDatastore

5 w+ K* h( A& @) B, U8 U% l# T! d" f* [7 B
5 w! I0 _9 o# E" |% L8 a: W0 [
关系数据库中的数据集合。需要数据库工具箱
/ W. c4 c: _1 e- Z
DatabaseDatastore

# X8 S- u) C. d  c6 [$ ~
函数语法
ds = datastore(location,Name,Value)
location用于指定输入文件或文件夹,Name,Value对指定相应操作参数,ds返回Datastore 类型结构。
创建和读取DATASTORE
使用DATASTORE函数创建数据存储。例如,从示例文件AyrimeSelMal.CSV创建datastore。该文件包括关于单个航班的出发和到达信息。
ds = datastore('airlinesmall.csv')
DATASTORE函数自动确定要创建的Datastore类型。在这个示例中,Datastore类型是TabularTextDatastore。
l  可以使用SelectedVariableNames属性指定感兴趣的变量(列),以预览或读取这些变量。
l  可以在数据中指定表示缺失值的值。在航空母线CSV中,缺失值由NA表示。
l  如果数据量小于内存容量,则可以使用RealDALL函数读取数据。否则,使用读取函数读取部分数据。默认情况下,读取函数一次从TabLabTeDATAsDestor读取20000行。但是,可以通过向 ReadSize 属性分配新值来更改此值。
l  使用RESET函数将Datastore恢复到之前的初始状态。通过在while循环中调用read函数,可以对每个数据子集执行中间计算,然后在最后聚合中间结果。
l  果每个单独文件中的数据量小于内存容量,则可以指定每次读取一个完整的文件,而不是读取特定数量的行。
l  除了读取Datastore中的数据子集之外,还可以将MapReduce的map和reduce函数应用到Datastore中。

; G* b# r! D3 \1 m
二、MapReduce
随着数据采集设备的数量和类型逐年增加,所收集的数据的大小和速率正在迅速扩大。这些大数据集可以包含千兆字节或兆字节的数据,并且可以按兆字节或千兆字节的顺序增长。虽然收集的信息提供了洞察力的机会,它也提出了许多挑战。大多数算法不是设计成在合理的时间或合理的内存量下处理大数据集。MapReduce允许您满足这些挑战,从大型数据集获得重要的见解。
MapReduce是什么?
MapReduce是用于分析不适合于内存的数据集的编程技术。您可能熟悉Hadoop MapReduce,它是使用Hadoop分布式文件系统(HDFS™)的流行实现。Matlab®提供了与MapReduce功能略有不同的MapReduce实现。
MapReduce使用DATASTORE处理满足内存的小块中的数据。每个块经过Map阶段,对要处理的数据进行格式化。然后中间数据块经过Reduce阶段,聚集中间结果以产生最终结果。Map和Reduce阶段由Map和Meduce函数编码,这是MapReduce的主要输入。Reduce和Reduce函数有无穷的组合来处理数据,因此这种技术对于处理大型数据处理任务既灵活又极其强大。
MapReduce可扩展到在多个环境中运行。有关这些功能的更多信息,请参见使用其他产品加速和部署MapReduce。
MapReduce功能的效用在于它能够在大数据集合上执行计算。因此,MapReduce不适合对可直接加载到计算机内存中并用传统技术进行分析的正常大小的数据集执行计算。相反,使用MapReduce对不适合内存的数据集执行统计或分析计算。
MapReduce对每个映射或减少函数的调用独立于所有其他调用。例如,对MAP函数的调用不能依赖于先前调用MAP函数的输入或结果。最好把这样的计算分解成MapReduce的多个调用。
算法步骤:
l  mapreduce使用[data,info]=read(ds)从输入数据存储读取数据块,然后调用map函数来处理该块。
l  map函数接收数据块,组织数据块或执行初始计算,然后使用add和add多功能向中间数据存储对象KeyValueStore添加键-值对。MapReduce调用MAP函数的次数等于输入数据存储块中的块数。
l  mapreduce函数对数据存储中的所有数据块处理之后,通过唯一key对中间KeyValueStore对象中的所有值进行分组。
l  接下来,MapReduce对map函数添加的每个唯一key调用一次Reduce函数。每个唯一的key可以有许多相关的值。MapReduce将值传递给Reduce函数作为ValueIdapter对象,该对象是用于遍历值的对象。每个唯一键的ValueIterator 对象包含该键的所有相关值。
l  Reduce函数使用hasnext和getnext函数一次迭代ValueIterator对象中的一个值。然后,在聚合来自map函数的中间结果之后,reduce函数使用add和addmulti函数将最终的键-值对添加到输出。输出中的键的顺序与reduce函数将它们添加到最终KeyValueStore对象的顺序相同。也就是说,MapReduce没有明确地对输出进行排序。
例子:
1、准备数据
使用MapReduce的第一步是为数据集构Datastore。除了map和reduce函数之外,数据集的Datastore也是map reduce所需的输入,因为它允许mapreduce以块形式处理数据。
MapReduce与TabularTextDatastore、IMAGEDATASTORE或KEYVALUDATATASOR一起工作。TabularTextDatastore是用于文本文件的数据存储,ImageDatastore是用于图像的数据存储,KeyValueDatastore是用于键-值对的数据存储。DATASTORE函数自动确定哪种类型适合于数据集。例如,如果为airline..csv数据集创建数据存储,则数据存储确定它应该是TabularTextDatastore。MapReduce函数在Datastore上执行读取,以检索数据传递给MAP函数。因此,可以使用SelectedVariableNames、SelectedFormats和ReadSize选项直接配置mapreduce传递给map函数的块大小和数据类型。
ds = datastore('airlinesmall.csv','TreatAsMissing','NA')
ds.SelectedVariableNames = 'Distance';
2、写Map 和 Reduce 函数
Map 函数输入包括 data, info, intermKVStore。data 和 info是对输入Datastore调用 read 函数的结果,intermKVStore 是中间 KeyValueStore 目标的名字。
map函数
function MeanDistMapFun(data, info,intermKVStore)
   distances = data.Distance(~isnan(data.Distance));
   sumLenValue = [sum(distances) length(distances)];
   add(intermKVStore, 'sumAndLength', sumLenValue);
end
第一行在距离数据块中筛选出所有的NA值。第二行创建一个包含块总距离和计数的两元素向量,第三行用键“sumAndLength”将该值向量添加到intermKVStore。
Reduce函数
Reduce函数输入包括intermKey, intermValIter和outKVStore。intermKey 是MapReduce每次调用Reduce函数时都会指定一个新的唯一键,对应被Map函数添加到中间KeyValueStore 对象的键值对。intermValIter是 ValueIterator与激活键 intermKey的相关联的量.ValueIterator对象包含所有与活动键关联的值. outKVStore最终 KeyValueStore 目标的键名, reduce函数需要添加的键值对。 Mapreduce从 outKVStore 取出键值对作为datastore的输出。
reduce函数
function MeanDistReduceFun(intermKey,intermValIter, outKVStore)
   sumLen = [0 0];
    whilehasnext(intermValIter)
       sumLen = sumLen + getnext(intermValIter);
    end
   add(outKVStore, 'Mean', sumLen(1)/sumLen(2));
end
3、运行mapreduce
在拥有 datastore、map和reduce 函数之后,可以调用MapReduce来执行计算。计算数据集中的平均飞行距离。
outds = mapreduce(ds, @MeanDistMapFun,@MeanDistReduceFun);
4、观察结果
使用 readall 观察输出(datastore类型)结果
readall(outds)
三、MAT-Files
使用matfile函数直接从磁盘上的MAT文件中访问MATLAB∈变量,而不需要将全部变量加载到内存中。当您使用matfile创建新文件时,该函数将创建一个7.3版本的MAT文件,该文件还允许您保存大于2GB的变量。
·       m = matfile(filename)
·       m = matfile(filename,'Writable',isWritable)
四、内存映射
m = memmapfile(filename)
m =memmapfile(filename,Name,Value)
1、什么是内存映射?
内存映射是将磁盘上的文件的一部分或整个文件映射到应用程序地址空间中的地址范围的机制。然后,应用程序可以以访问动态内存的方式访问磁盘上的文件。这使得文件读取和写入速度比使用 fread 和fwrite等功能更快。
2、内存映射的好处
内存映射的主要优点是效率、更快的文件访问、应用程序之间共享内存的能力以及更高效的编码。
l  更快的文件访问
通过内存映射访问文件比使用I/O功能更快,如 fread 和fwrite。数据是使用内置到操作系统中的虚拟内存功能读取和写入的,而不必分配、复制到进程所拥有的数据缓冲区中,然后释放这些缓冲区。
Matlab®在第一次构建map时不从磁盘访问数据。它只在访问内存映射的指定部分时读取或写入磁盘上的文件,然后只读取该特定部分。这为映射数据提供了更快的随机访问。
l  效率
将文件映射到内存允许访问文件中的数据,就好像该数据已被读入应用程序的地址空间中的数组一样。最初,MATLAB只为数组分配地址空间;在访问映射区域之前,它并不实际从文件中读取数据。因此,内存映射文件提供了一种机制,通过该机制,应用程序可以访问非常大的文件中的数据段,而无需首先将整个文件读入内存。
l  高效编码风格
Matlab应用程序中的内存映射使您能够使用标准的MATLAB索引操作访问文件数据。一旦将文件映射到内存,就可以使用与从MATLAB工作空间读取变量相同的MATLAB语句读取该文件的内容。映射文件的内容就好像它们是当前活动工作区中的数组一样。您只需对该数组进行索引,就可以从文件中读取或写入所需的数据。因此,您不需要对fread 和fwrite函数进行显式调用。
在Matlab中,如果X是内存映射变量,Y是要写入文件的数据,那么写入文件就简单了。
x.Data = y;
l  在应用程序之间共享内存
内存映射文件还提供了一种在应用程序之间共享数据的机制,如下图所示。这是通过让每个应用程序映射相同文件的部分来实现的。您可以使用此特性在MATLAB和其他应用程序之间传输大型数据集。此外,在单个应用程序中,可以多次映射文件的同一段。
3、何时使用内存映射
将文件映射到内存的好处主要取决于文件的大小和格式、使用文件中数据的方式以及所使用的计算机平台。
l  内存映射最适合二进制文件,并且在下面的场景中:
对于要随机访问一次或多次的大文件
对于希望读取内存并访问频繁的小文件
对于要在应用程序之间共享的数据
当您想要处理文件中的数据时,就像它是一个Matlab数组一样。
+ r+ J# Q6 `& H
l  以下类型的文件不能充分利用内存映射的好处:
格式化的二进制文件,如HDF或TIFF,需要定制的阅读器,不利于内存映射。描述这些文件中包含的数据可能是一项非常复杂的任务。此外,不能直接从映射段访问数据,而必须创建数组来保存数据。
文本或ASCII文件需要将映射区域中的文本转换为合适的类型,以使数据具有意义。这占用了额外的地址空间。
大于几百兆字节的文件会消耗MATLAB处理程序所需的大量虚拟地址空间。映射这种大小的文件可能会导致MATLAB更频繁地报告内存错误。如果Matlab已经运行了一段时间,或者如果MATLAB所使用的内存变得碎片化,那么这更有可能。
/ U  ]7 K4 ]0 P1 p# |. L3 x$ H
4、内存映射的最大大小
由于操作系统和MATLAB设置的限制,可以用内存映射的单个实例映射的最大数据量为32位系统上的2GB,64位系统上的256TB。如果需要映射超过此限制,则可以为文件的不同区域创建单独的映射,也可以将一个映射的窗口移动到文件中的不同位置。
5、字节排序
. s+ _! E: W# ~
8 p: h: |- O7 G6 M) g: ~/ s
内存映射仅与具有与操作系统的本机字节顺序相同的字节排序方案的数据一起工作。例如,因为 Linus Torvalds' Linux® 和Microsoft® Windows® 系统都使用小端字节排序,所以可以在Windows系统上读取在Linux系统上创建的数据。您可以使用computer函数来确定当前系统的本机字节顺序。
6 k# ]! o1 |5 B' l! r
  • TA的每日心情
    开心
    2019-11-21 15:51
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-2-27 16:16 | 只看该作者
    大文件和大数据
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-21 10:36 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表